從資料集更新資料庫(來自MSDN)

2021-04-18 02:34:47 字數 3091 閱讀 4257

當在資料集中作出更改之後,可以將更改傳遞給資料來源。完成此操作時最常用的方法是呼叫資料介面卡的 update 方法。該方法依次通過資料表中的每個記錄,確定需要什麼型別的更新(更新、插入或刪除),然後執行適當的命令(如果有)。

安全說明當使用

commandtype 屬性設定為text的資料命令時,請對從客戶端傳送過來的資訊進行仔細檢查,然後再將它傳遞給資料庫。惡意使用者可能會試圖傳送(插入)修改過的或其他 sql 語句,以獲得未經授權的訪問或破壞資料庫。在將使用者輸入內容傳輸到資料庫之前,應始終確認這些資訊是有效的;如果可能的話,請始終使用引數化查詢或儲存過程,這是最佳措施。有關更多資訊,請參見

指令碼利用。

為了闡釋如何進行更新,假設您的應用程式使用乙個包含單個資料表的資料集。該應用程式從資料庫中獲取兩行。在檢索之後,記憶體中的資料表類似於下面這樣:

複製**

(rowstate)     customerid   name             status

(unchanged) c200 robert lyon good

(unchanged) c400 nancy buchanan pending

應用程式將 nancy buchanan 的狀態更改為「preferred」。作為這種更改的結果,該行datarow.rowstate屬性的值從unchanged更改為modified。第一行rowstate屬性的值保持為unchanged。資料表現在類似於下面這樣:

複製**

(rowstate)     customerid   name             status

(unchanged) c200 robert lyon good(modified)c400 nancy buchanan preferred

應用程式現在呼叫update方法,將資料集傳送給資料庫。該方法依次檢查每一行。對於第一行,由於它從最初取自資料庫後未經過更改,所以該方法不向資料庫傳送任何 sql 語句。

但是對於第二行,update方法將自動呼叫適當的資料命令並將其傳送給資料庫。sql 語句的具體語法取決於基礎資料儲存區所支援的 sql 語言分支。但所傳送的 sql 語句具有下列值得注意的一般特徵:

資料庫中要更新的記錄的值通常使用引數來進行傳遞。當資料介面卡的update方法執行 update 語句時,它需要填寫引數值。它從parameters集合中為適當的資料命令(在本例中是資料介面卡中的updatecommand物件)獲取這些值。

如果您已使用 visual studio 工具來生成資料介面卡,則updatecommand物件將包含乙個引數集合,這些引數對應於語句中的每個引數佔位符。

每個引數的 sqlparameter.sourcecolumn 屬性指向資料表中的一列。例如,au_id 和 original_au_id 引數的sourcecolumn屬性設定為包含作者 id 的資料表中的任意一列。當介面卡的update方法執行時,它從所更新的記錄中讀取作者 id 列,並將值填充到語句中。

在 update 語句中,您需要指定新值(將寫入記錄的值)和舊值(以便在資料庫中查詢要更新的記錄)。因此,每個值都有兩個引數:乙個用於 set 子句,另乙個則用於 where 子句。兩個引數都從所更新的記錄中讀取資料,但根據引數的 sqlparameter.sourceversion 屬性,它們會獲取該列值的不同版本。set 子句的引數獲取當前版本,而 where 子句的引數獲取初始版本。

注意您還可以自己用**在parameters集合中設定值,這通常在資料介面卡

rowchanging 事件的事件處理程式中進行。有關更多資訊,請參見

資料介面卡命令中的引數。

如果資料集包含多個表,則必須通過分別呼叫每個資料介面卡的update方法來逐個更新這些表。如果這些表具有父子關係,很可能需要以特定的順序將更新傳送到資料庫。常見的情況是已經將父記錄和相關子記錄新增到資料集中,例如乙個新的客戶記錄及乙個或多個相關的訂單記錄。如果資料庫本身強制關係完整性規則,那麼當您在建立父記錄之前將新的子記錄傳送到資料庫時,資料庫將引發錯誤。

子表:刪除記錄。

父表:插入、更新和刪除記錄。

子表:插入和更新記錄。

在許多情況下,在更新資料來源之後,將需要通過重新填充資料集來對其進行重新整理。這樣做有下列好處:

通過在呼叫介面卡的update方法之後呼叫其fill方法,可以手動重新整理資料集。

或者,您可以配置資料介面卡,使其在執行更新後自動執行 sql select 語句或儲存過程。這種情況下,資料介面卡將為updatecommandinsertcommand物件建立兩個 sql 語句。第乙個語句執行更新,第二個語句是乙個用於重新整理資料集的 select 語句。

注意為了讓第二個 select 語句執行,資料來源必須像在 sql server 中一樣支援批查詢。
有關配置資料介面卡的更多資訊,請參見資料介面卡配置嚮導。

由於資料集與資料來源是分開的,您並不持有資料來源中記錄上的鎖。因此,如果要更新資料庫,並且如果維護併發控制對應用程式來說十分重要,則必須協調資料集中的記錄和資料庫中的記錄。例如,您可能發現資料庫中的記錄在上一次填充資料集之後已經更改。在這種情況下,必須執行適合於應用程式的邏輯來指定如何處理資料庫記錄或資料集中已更改的記錄。有關更多資訊,請參見 ado.net 中的併發控制。

從資料集更新資料庫

可將dataset視為從資料庫檢索出的資料的記憶體內快取。dataset由表 關係和約束的集合組成。private system.data.sqlclient.sqldataadapter sqldataadapter1 private system.data.sqlclient.sqlconnec...

資料庫 資料更新

資料庫更新操作有三種 在表中新增若干行資料 修改表中的資料和刪除表中的若干行資料。sql中有三類相應的語句,分別是插入資料 insert 修改資料 update 刪除資料 delete insert values 插入單行或多行元組資料 例 向資料庫mysql test的表customers中插入這...

如何 將更新從資料庫匯入資料庫專案

首次建立資料庫專案時,通常需要從現有的生產資料庫中匯入資料庫架構。如果在開發過程中對成品伺服器應用了更改,那麼您可能還需要將這些更改匯入您的專案中。不能使用 匯入資料庫架構 命令,因為該命令僅適用於尚未包含資料庫物件的專案。若要匯入對資料庫伺服器所做的更改,必須使用 架構比較 注意 在使用 架構比較...