いくつかのテーブルを持つデータベースとして SQLite を使用する C# winforms アプリケーションがあります。
アプリケーションには、datagridview
データベースからのデータを表すコントロールがあります。
ユーザーがデータベース テーブルのフィールドを変更できるようにしたいのですが、SQL `ALTER クエリを使用すると簡単に変更できます。
INSERT
問題は、有効なクエリを作成するためにテーブルのフィールド名を知る必要があるため、ユーザーがデータベース テーブルにデータを挿入したい場合に発生します。
ユーザーがデータベース内のテーブルのフィールド名を変更できるようにするオプションがなかったため、通常はフィールド名をハードコードするだけでした。
私の考えでは、私のINSERT
クエリはdatagridview
の列名を使用するため、ユーザーがテーブルのフィールド名を変更すると、グリッドのフィールド名も変更され、アプリケーションが実行されるたびに、グリッドの列はデータベース テーブルと同じ名前に命名されます。 .
そうすれば、常に正しいフィールド名にアクセスできます。
または、文字列の代わりにインデックスを使用してフィールドを参照できますか?
通常、このコードを使用してデータを挿入します。
class SQLiteDatabase
{
//...
public bool Insert(String tableName, Dictionary<String, String> data)
{
String columns = "";
String values = "";
Boolean returnCode = true;
foreach (KeyValuePair<String, String> val in data)
{
columns += String.Format(" {0},", val.Key.ToString());
values += String.Format(" '{0}',", val.Value);
}
columns = columns.Substring(0, columns.Length - 1);
values = values.Substring(0, values.Length - 1);
try
{
this.ExecuteNonQuery(String.Format("insert into {0}({1}) values({2});", tableName, columns, values));
}
catch(Exception fail)
{
MessageBox.Show(fail.Message);
returnCode = false;
}
return returnCode;
}
//...
}
db = new SQLiteDatabase();
Dictionary<String, String> myData = new Dictionary<String, String>();
myData.Add("NAME", "something");
myData.Add("LAST_NAME", "something");
try
{
db.Insert("TABLE_NAME", myData);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
編集:SQLiteでは、列の名前を変更したり、列を削除したり、テーブルから制約を追加または削除したりすることはできないと読みました.... WTF? これは、列の名前を変更するソリューションです...