編集:GridViewでAutoGenerateColumns = "true"を使用し、SqlDataSourceを介してデータを入力すると、追加のコードなしで、名前でコントロールの値がSQLクエリの適切なパラメーターに自動的にバインドされるようです。ただし、GetInsertCommand(true)
コマンドが列名を使用するように、などを使用する必要があります(使用方法を示す以下のコードを参照してくださいSqlCommandBuilder
。ただし、テストで発見したように、いくつかの落とし穴があります。
DataKeyNames
GridViewのを設定する必要があります
OldValuesParameterFormatString="Original_{0}"
sqlDSを設定する必要があります。
- 古い値を比較せずに更新するだけの場合は、が必要
scb.ConflictOption = System.Data.ConflictOption.OverwriteChanges;
になります。SqlCommandBuilder
- プログラムでSqlDataSourceにSelect/Update / DeleteCommandを設定している場合は、すべてのポストバックでそれを実行する必要があるようです。
ただし、カスタマイズが必要な場合は、コントロールSqlDataSource
がイベントInserting
を提供します。このイベントを使用して、データベースでSQLアクションが実行される前にパラメーターを設定できます。Updating
Deleting
sqlDS.Updating += new SqlDataSourceCommandEventHandler(sqlDS_Updating);
protected void sqlDS_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
e.Command.Parameters["@Name"].Value = // retrieve value from user entry
}
Inserting
アクセスを介して、Deleting
イベントでも同じようなことができe.Command.Parameters[...]
ます。
クラスを使用して適切なDelete/Insert / Updateコマンドを自動的に生成することもできるSqlCommandBuilder
ため、すべてのテーブルを含む巨大なswitchステートメントを作成する必要がないことに注意してください。次に例を示します。
string tableName = ddl.SelectedValue;
string connectionString = ConfigurationManager
.ConnectionStrings["MyConnectionString"].ConnectionString;
string select = "SELECT * FROM [" + tableName + "]";
SqlDataAdapter sda = new SqlDataAdapter(select, connection);
SqlCommandBuilder scb = new SqlCommandBuilder(sda);
sqlDS.SelectCommand = select;
sqlDS.InsertCommand = scb.GetInsertCommand(true).CommandText;
sqlDS.UpdateCommand = scb.GetUpdateCommand(true).CommandText;
sqlDS.DeleteCommand = scb.GetDeleteCommand(true).CommandText;
もちろん、これには、関連する更新および削除ステートメントを生成するために使用できる主キーがすべてのテーブルにある必要があります。そうでない場合は、動的SQL生成に関する例外が発生します。データベースエンジンでスキーマを検索する実行時のコストのためにこの方法が気に入らない場合でも、すべてを手動で入力する代わりに、T4テンプレートを使用してすべてを事前に生成することができます。