2012-04-16 10 views
9

私は、同じページにSqlDataSourceとGridviewとDropDownListを持っています。 DropDownListの選択肢は、SelectCommands,UpdateCommands、およびDeleteCommandsのセットに関連付けられているため、GridView AutoGenerateEditButton = "true"およびAutoGenerateUpdateButton = "true"メカニズムを利用できます。イベントオーダーの背後にあるSqlDataSourceコード

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です。

+0

ASPにはDy​​namic Dataという名前のビルトインテンプレートがあります。データソース内の任意のテーブルからレコードを表示、更新、編集、および削除する機能を総称して提供するNet out-of-the-box。個々のページ、個々のアクション、フィールドタイプなどをカスタマイズすることもできます。詳細はこちらhttp://msdn.microsoft.com/en-us/library/ee845452(v=VS.100).aspx – mellamokb

+0

'LinqDataSource'とLINQ-To-SQL/etcを使います。あなたのデータベースを扱うための?それは選択/挿入/更新の配管を自動的に処理するので、はるかに簡単です。 – mellamokb

+0

動的データを使用しない場合でも、ソースコードの一部を見直して、コードを単純化し、SQLステートメントを生成するための組み込みツールを活用するアイデアを得ることは、悪い考えではないかもしれませんこの種のことはこれまで何度も行われてきましたが、あなたがそれをどうやって動くかによって、それを行うのがはるかに簡単ではるかに難しくなります。 – mellamokb

答えて

10

編集:あなたがGridViewの上AutoGenerateColumns =「true」を使用して、SqlDataSourceコントロールを経由して移入場合、それは自動的に余分ななしSQLクエリ内の適切なパラメータに名前によってコントロールの値を結合するように見えるんコード。しかし、我々はコマンドが列名を使用するようにGetInsertCommand(true)などを使用する必要があります(私はSqlCommandBuilderを使用する方法を示して場所の下のコードを参照してくださいいくつかの落とし穴は、私がテストで発見したしかしとして、があります。

  • あなたがあなたのSQLDSにOldValuesParameterFormatString="Original_{0}"を設定する必要がありますあなたのGridView
  • DataKeyNamesを設定する必要があります。
  • あなただけの古い値を比較することなく更新する場合は、あなたのSqlCommandBuilderscb.ConflictOption = System.Data.ConflictOption.OverwriteChanges;が必要になります。
  • それ選択/更新/削除を設定している場合に表示されますプログラムでSqlDataSourceのeCommandを実行するには、すべてのポストバックでそれを行う必要があります。

しかし、あなたがカスタマイズする必要がある場合には、SqlDataSource制御がInsertingイベントを提供し、Updating、あなたはSQLアクションがデータベース上で取られる前にパラメータを設定するために使用することができます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 
} 

InsertingDeletingイベントでは、e.Command.Parameters[...]アクセスで同じ種類のことを行うことができます。


あなたは、テーブルのすべてを含む巨大なswitch文を構築する必要がないように、あなたもSqlCommandBuilderクラスを使用して、自動的に適切な挿入/更新/削除コマンドを生成することができます注。ここに例があります:

これはもちろん、すべてのテーブルに関連する更新および削除文の生成に使用できる主キーが必要です。そうでない場合は、動的SQL生成に関する例外が発生します。データベースエンジンでスキーマをルックアップするための実行時のコストのためにこのメソッドが気に入らなくても、手作業ですべてを入力するのではなく、T4テンプレートを使用してすべてを事前に生成することができます。

+1

ありがとうございました! SqlCommandBuilderの.GetInsertCommand(true)部分は、私が見逃していたものでした。私は動的にコマンドの代わりに文字列を生成していました!私はLinqDataSourceの使用を最終的に計画していますが、私のコードの一部だけがLinqを使用しています。私はそれを更新する過程にある。再度、感謝します! – Mark

関連する問題