/// <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); }
/// <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); }
/// <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)); } } } } }
/// <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); }
/// <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(); } // 元に戻す } }
/// <summary>行がnullまたは空</summary> public static bool IsNullOrEmpty(SQLiteRow row) { return(row == null || row.Count <= 0); }