Beispiel #1
0
 /// <summary>要素の連結</summary>
 public SQLiteRow AddRange(SQLiteRow addition)
 {
     foreach (var item in addition)
     {
         if (!this.ContainsKey(item.Key))
         {
             this.Add(item.Key, item.Value);
         }
     }
     return(this);
 }
 /// <summary>TableCell → 文字列 (なければ空文字列)</summary>
 public static string GetColumn(this SQLiteRow row, string name)
 {
     if (!string.IsNullOrEmpty(name) && row != null && row [name] != null)
     {
         var val = row [name] as string;
         if (!string.IsNullOrEmpty(val))
         {
             return(string.Copy(val));
         }
     }
     return(string.Empty);
 }
 /// <summary>TableCell → Parse → 値 (なければ指定値)</summary>
 public static T GetColumn <T> (this SQLiteRow row, Parser <T> parser, string name, T defaultValue = default)
 {
     if (!string.IsNullOrEmpty(name) && row != null && row [name] != null && parser != null)
     {
         var val = row [name] as string;
         if (!string.IsNullOrEmpty(val))
         {
             return(parser(val));
         }
     }
     parser = null;
     return(defaultValue);
 }
Beispiel #4
0
        /// <summary>値を指定して行を加える</summary>
        public void AddRow(object [] values)
        {
            if (values.Length != Columns.Count)
            {
                throw new IndexOutOfRangeException("The number of values in the row must match the number of column");
            }
            var row = new SQLiteRow();

            for (int i = 0; i < values.Length; i++)
            {
                row.Add(Columns [i].Name, values [i]);
            }
            this.Rows.Add(row);
        }
Beispiel #5
0
 /// <summary>ステートメントにSQL引数をバインドする 必要なら':'が補われる</summary>
 private void BindParameter(SQLiteRow param)
 {
     if (param != null)
     {
         foreach (string key in param.Keys)
         {
             object val  = param [key];
             string name = (key [0] == ':' || key [0] == '@' || key [0] == '$') ? key : $":{key}";
             if (val == null)
             {
                 sqlite3_bind_null(this.pointer, sqlite3_bind_parameter_index(this.pointer, name));
             }
             else if (val is string)
             {
                 sqlite3_bind_text(this.pointer, sqlite3_bind_parameter_index(this.pointer, name), System.Text.Encoding.UTF8.GetBytes((string)val), System.Text.Encoding.GetEncoding("UTF-8").GetByteCount((string)val), new IntPtr(-1));
             }
             else if (val is byte [])
             {
                 sqlite3_bind_text(this.pointer, sqlite3_bind_parameter_index(this.pointer, name), (byte [])val, ((byte [])val).Length, new IntPtr(-1));
             }
             else if (val is float)
             {
                 sqlite3_bind_double(this.pointer, sqlite3_bind_parameter_index(this.pointer, name), (double)(float)val);
             }
             else if (val is double)
             {
                 sqlite3_bind_double(this.pointer, sqlite3_bind_parameter_index(this.pointer, name), (double)val);
             }
             else if (val.IsInt32())
             {
                 sqlite3_bind_int(this.pointer, sqlite3_bind_parameter_index(this.pointer, name), (int)val);
             }
             else                                                 // その他の型
             {
                 if (val.Equals(val.GetType().GetDefaultValue())) // デフォルト値ならNULL
                 {
                     sqlite3_bind_null(this.pointer, sqlite3_bind_parameter_index(this.pointer, name));
                 }
                 else                                                                                             // 既定の文字列化
                 {
                     val = (val is DateTime) ? ((DateTime)val).ToString("yyyy-MM-dd HH:mm:ss")  : val.ToString(); // 日時の文字列化書式を制御
                     sqlite3_bind_text(this.pointer, sqlite3_bind_parameter_index(this.pointer, name), System.Text.Encoding.UTF8.GetBytes((string)val), System.Text.Encoding.GetEncoding("UTF-8").GetByteCount((string)val), new IntPtr(-1));
                 }
             }
         }
     }
 }
Beispiel #6
0
 /// <summary>SQLステートメントの生成</summary>
 public Statement(SQLite database, string query, SQLiteRow param = null)
 {
     this.database = database;
     this.pointer  = IntPtr.Zero;
     if (this.database != null && !database.IsOpen)
     {
         throw new SQLiteException("SQLite database is not open.");
     }
     if (sqlite3_prepare_v2(this.database.ptrSQLiteDB, query, System.Text.Encoding.GetEncoding("UTF-8").GetByteCount(query), out this.pointer, IntPtr.Zero) != SQLiteResultCode.SQLITE_OK)
     {
         IntPtr errorMsg = sqlite3_errmsg(this.database.ptrSQLiteDB);
         throw new SQLiteException(Marshal.PtrToStringAnsi(errorMsg));
     }
     if (param != null)
     {
         this.BindParameter(param);
     }
 }
 /// <summary>TableCell → インスタンスまたはEnum (なければ指定値)</summary>
 public static T GetColumn <T> (this SQLiteRow row, string name, T defaultValue)
 {
     if (!string.IsNullOrEmpty(name) && row != null && row [name] != null)
     {
         if (typeof(T).IsEnum)
         {
             var val = row [name] as string;
             if (!string.IsNullOrEmpty(val))
             {
                 return((T)System.Enum.Parse(typeof(T), val));
             }
         }
         else
         {
             var cell = row [name];
             return(cell.IsScalar() ? (T)cell : (T)Activator.CreateInstance(typeof(T), cell as string));
         }
     }
     return(defaultValue);
 }
Beispiel #8
0
        /// <summary>単文を実行</summary>
        public void ExecuteNonQuery(string query, SQLiteRow param = null)
        {
            var close = !this.IsOpen;             // 元の状態

            this.Open();
            try {
                using (Statement statement = new Statement(this, query, param)) {
                    if (statement.Pointer != IntPtr.Zero)
                    {
                        this.ExecuteNonQuery(statement);
                    }
                }
            }
            catch (SQLiteException e) {
                Debug.LogError($"SQLite: Can't ExecuteNonQuery {e}");
            }
            finally {
                if (close)
                {
                    this.Close();
                }                                             // 元に戻す
            }
        }
Beispiel #9
0
 /// <summary>行がnullまたは空</summary>
 public static bool IsNullOrEmpty(SQLiteRow row)
 {
     return(row == null || row.Count <= 0);
 }