該主題說明了如何使用 DataSet 在數據庫中更新數據。你依然可以直接使用 SqlCommand 在數據庫中插入、更新、和刪除數據,記住這一點也很重要。理解“ 從數據庫填充DataSet”涵蓋的概念有助於你理解這個主題。
前一篇“
從數據庫填充 DataSet”涵蓋的部分主題包括從數據庫檢索數據和填充到 DataSet,以及 DataSet 怎樣有別於數據庫。一旦 DataSet 被加載,你可以修改數據,並且DataSet 會跟蹤變化。
DataSet 可以被認為是從數據庫檢索出的在內存中的緩存數據。DataSet 包含一組表、關系、和約束。示例1中演示如何使用 Add 方法在 DataTable 添加新數據到 DataSet。Add 方法要么接受預期數據列的數組,要么接受 DataRow 作為參數。
示例1:
SqlConnection myConnection = new SqlConnection("server=(local);Integrated Security=SSPI;database=northwind"); SqlDataAdapter myDataAdapter = new SqlDataAdapter("SELECT * FROM Customers", myConnection); DataSet myDataSet = new DataSet(); DataRow myDataRow; // 創建命令構建器,會自動創建更新命令,不必手動提供或創建。 SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myDataAdapter); // 為 MissingSchemaAction 屬性設置 AddWithKey,除非指定 AddWithKey,Fill 將不會檢索到主鍵 & 唯一鍵信息。 myDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; myDataAdapter.Fill(myDataSet, "Customers"); myDataRow = myDataSet.Tables["Customers"].NewRow(); myDataRow["CustomerId"] = "NewID"; myDataRow["ContactName"] = "New Name"; myDataRow["CompanyName"] = "New Company Name"; myDataSet.Tables["Customers"].Rows.Add(myDataRow); myDataAdapter.Update(myDataSet, "Customers");
請記住,DataTable 必須通過 NewRow 方法返回 DataRow。NewRow 方法返回了與 DataTable 匹配架構的 DataRow 對象。直到新的 DataRow 被添加到 RowsCollection集合之前,它一直獨立於這個表。
可以通過 DataRow 改動數據。可以通過 Rows 屬性的 RowsCollection 集合使用行索引,如示例2:
示例2:
myDataSet.Tables["Customers"].Rows[0]["ContactName"]="Peach";
你也可以通過主鍵值訪問一個特定行,如示例3:
示例3:
DataRow myDataRow1 = myDataSet.Tables["Customers"].Rows.Find("ALFKI"); myDataRow1["ContactName"]="Peach";
示例3中的 “ALFKI” 是 “Customers” 表中的主鍵 “CustomerID” 的值。當使用 SqlDataAdapter 時,主鍵是從庫中建立的。即使沒有使用庫,你也可以通過 PrimaryKey 屬性設置主鍵值。
使用 Delete 方法移除行。請記住,發生在 DataSet 上的邏輯刪除,只有在 DataSet 被更新到數據庫時候才會被物理刪除(示例4)。同樣地,在行被保存的情況下,你可以使用 DataSet 的 RejectChanges 放棄更改。
示例4:
myDataSet.Tables["Customers"].Rows[0].Delete();
行里維護着原始值和新值。原始值和新值皆可以允許被 RowChanging 事件訪問,以便決定是否繼續編輯。因為我們維護着原始值和新值,所以我們可以建立如樂觀鎖定和鍵值改變的場景。
在提交更改回數據庫之前,你需要設置 InsertCommand、UpdateCommand、和 DeleteCommand 命令使數據庫的變動和 DataSet 一致。對於受限的場景,你可以使用 SqlCommandBuilder 構建器自動生成那些命令對象,如示例5:
示例5:
SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(mySqlDataAdapter);
從 DataSet 提交數據到數據庫,使用 SqlDataAdapter 的 Update 方法,如示例6:
示例6:
mySqlDataAdapter.Update(myDataSet, "Customers");
