2012-04-16 84 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(); 
} 

如何或在什麼時候需要添加參數?它是自動的嗎?我基本上只想要更新和刪除表中的列的能力。我想在實際的.cs文件中完成所有這些操作,而不是在.aspx文件中完成,因爲我最終希望使其更具動態性。但現在我只是想要了解基礎知識。我懷疑我可能在不適當的事件中使用了DataBind()邏輯,因爲我沒有完全理解與數據綁定關聯的事件的順序。

查詢不復雜,不涉及連接或視圖;它們是簡單的SELECT表單。

+0

有一個名爲動態數據的內置模板,附帶ASP。網絡開箱即用,通常可以查看,更新,編輯和刪除數據源中任何表中的記錄。您還可以自定義單個頁面,單個操作,字段類型等。有關詳細信息,請訪問:http://msdn.microsoft.com/en-us/library/ee845452(v=VS.100).aspx – mellamokb 2012-04-21 02:14:43

+0

您是否考慮過使用'LinqDataSource'和LINQ-To-SQL /等。用於處理數據庫?它可以更容易,因爲它自動處理選擇/插入/更新的管道。 – mellamokb 2012-04-21 02:17:08

+0

即使您不使用動態數據,查看某些工作原理的源代碼也可能不是一個好主意,以瞭解如何簡化代碼並利用內置工具生成SQL語句等等。這種事情以前已經做過很多次了,取決於你如何去做這件事情,要做到這一點更容易,也更困難。 – mellamokb 2012-04-21 02:41:52

回答

10

編輯:它不會出現,如果你在GridView上使用的AutoGenerateColumns =「true」,並通過SqlDataSource的填充,它會自動通過名稱綁定控件的值,在SQL查詢中相應的參數沒有任何多餘的碼。然而,我們必須使用GetInsertCommand(true)等,從而使命令使用的列名(見下面,我展示瞭如何使用SqlCommandBuilder有幾個陷阱代碼,但是我在測試中已經發現:

  • 你需要設置你的GridView的DataKeyNames
  • 你需要設置OldValuesParameterFormatString="Original_{0}"您sqlDS。
  • 你需要在你的scb.ConflictOption = System.Data.ConflictOption.OverwriteChanges;SqlCommandBuilder如果你想不比較舊的值只更新。
  • 它看起來如果你正在填充選擇/更新/刪除以編程方式在SqlDataSource上執行eCommand,您必須在每次回發時執行此操作。

但是,如果你需要定製,在SqlDataSource控制提供了事件InsertingUpdatingDeleting,你可以用它來填充參數所採取的數據庫之前,SQL操作:

sqlDS.Updating += new SqlDataSourceCommandEventHandler(sqlDS_Updating); 

protected void sqlDS_Updating(object sender, SqlDataSourceCommandEventArgs e) 
{ 
    e.Command.Parameters["@Name"].Value = // retrieve value from user entry 
} 

通過e.Command.Parameters[...]訪問可以在InsertingDeleting事件中完成同樣的事情。


請注意,您還可以生成相應的刪除/插入/更新命令會自動使用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; 

當然,這將要求所有表都可以用來生成相關的更新和delete語句的主鍵。如果沒有,你會得到一個關於動態SQL生成的例外。即使由於在數據庫引擎上查找模式的運行時成本而不喜歡這種方法,您也可以使用T4模板預先生成它們,而不是手動輸入它們。

+1

非常感謝! SqlCommandBuilder的.GetInsertCommand(true)部分就是我所缺少的。我是動態生成一個字符串,而不是一個命令!我也計劃最終使用LinqDataSource,但現在只有一部分代碼使用Linq;我正在更新它的過程中。再次感謝! – Mark 2012-04-22 15:45:42