9

同じページにSqlDataSource、Gridview、DropDownListがあります。SelectCommandsDropDownListの選択は、、、UpdateCommandsおよびDeleteCommandsのセットに関連付けられているため、GridView AutoGenerateEditButton="true"およびAutoGenerateUpdateButton="true"メカニズムを利用できます。

Page_Load
{
  switch(ddl.SelectedItem.Text)
  {
     case "A":
       sqlDS.SelectCommand = "Select * From A";
       sqlDS.UpdateCommand = "Update A Set Name = @Name WHERE ID = @ID";
       sqlDS.DeleteCommand = "Delete A WHERE ID = @ID";
       break;
     ...
  }

  sqlDS.DataBind();
  grd.DataSourceID = sqlDS.ID;
  grd.DataBind();
}

どのように、またはどの時点でパラメータを追加する必要がありますか?自動ですか?基本的には、テーブルの列を更新および削除する機能が必要です。最終的にはより動的にしたいので、.aspxファイル内ではなく、実際の.csファイルでこれらすべてを実行したいと思います。しかし今のところ、私は基本を理解したいだけです。データバインディングに関連するイベントの順序を完全に理解していないため、不適切なイベントにDataBind()ロジックがあるのではないかと思います。

クエリは複雑ではなく、結合やビューは含まれません。これらは、単一のテーブルに対する単純なSELECTです。

4

1 に答える 1

10

編集:GridViewでAutoGenerateColumns = "true"を使用し、SqlDataSourceを介してデータを入力すると、追加のコードなしで、名前でコントロールの値がSQLクエリの適切なパラメーターに自動的にバインドされるようです。ただし、GetInsertCommand(true)コマンドが列名を使用するように、などを使用する必要があります(使用方法を示す以下のコードを参照してくださいSqlCommandBuilder。ただし、テストで発見したように、いくつかの落とし穴があります。

  • DataKeyNamesGridViewのを設定する必要があります
  • OldValuesParameterFormatString="Original_{0}"sqlDSを設定する必要があります。
  • 古い値を比較せずに更新するだけの場合は、が必要scb.ConflictOption = System.Data.ConflictOption.OverwriteChanges;になります。SqlCommandBuilder
  • プログラムでSqlDataSourceにSelect/Update / DeleteCommandを設定している場合は、すべてのポストバックでそれを実行する必要があるようです。

ただし、カスタマイズが必要な場合は、コントロールSqlDataSourceがイベントInsertingを提供します。このイベントを使用して、データベースでSQLアクションが実行される前にパラメーターを設定できます。UpdatingDeleting

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テンプレートを使用してすべてを事前に生成することができます。

于 2012-04-21T02:23:49.413 に答える