巧用ADO.NET DbCommandBuilder生成命令
ADO.NET還是比較常用的,于是我研究了一下ADO.NET,在這里拿出來和大家分享一下,希望對大家有用。如果在運行時動態指定 SelectCommand 屬性(例如,通過接受用戶提供的文本命令的查詢工具),那么您可能無法在設計時指定適當的 InsertCommand、UpdateCommand 或 DeleteCommand。 如果您的 DataTable 映射到單個數據庫表或者是從單個數據庫表中生成的,那么您可以利用 ADO.NET DbCommandBuilder對象來自動生成 DbDataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。
為了能夠自動生成命令,必須設置 SelectCommand 屬性,這是最低要求。 由 SelectCommand 屬性檢索的表架構確定自動生成的 INSERT、UPDATE 和 DELETE 語句的語法。
#T#為了返回構造 INSERT、UPDATE 和 DELETE SQL 命令所需的元數據,DbCommandBuilder 必須執行 SelectCommand。 因此,必須額外經歷一次到數據源的過程,這可能會降低性能。若要實現最佳性能,請顯式指定命令而不是使用 ADO.NET DbCommandBuilder。SelectCommand 還必須至少返回一個主鍵或唯一列。 如果不存在任何主鍵和唯一列,則會生成 InvalidOperation 異常,并且不會生成命令。當與 DataAdapter 關聯時,ADO.NET DbCommandBuilder會自動生成 DataAdapter 的 InsertCommand、UpdateCommand 和 DeleteCommand 屬性(如果它們為空引用)。 如果某個屬性已存在 Command,則使用現有 Command。
通過聯接兩個或更多個表來創建的數據庫視圖不會被視為單個數據庫表。 在這種情況下,您無法使用 DbCommandBuilder 來自動生成命令;必須顯式指定命令。 有關顯式設置命令以將對 DataSet 的更新解析回數據源的信息,請參見使用 DataAdapter 更新數據源 (ADO.NET)。
您可能需要將輸出參數映射回 DataSet 的更新行。 一項常見的任務是從數據源中檢索自動生成的標識字段或時間戳的值。 默認情況下,DbCommandBuilder 不會將輸出參數映射到更新行中的列。 在這種情況下,必須顯式指定命令。 有關將自動生成的標識字段映射回插入行的列的示例,請參見檢索標識或 Autonumber 值 (ADO.NET)。
更新和刪除的開放式并發模型
為 UPDATE 和 DELETE 語句自動生成命令的邏輯基于“開放式并發” -- 即未鎖定記錄的編輯功能,其他用戶或進程可以隨時修改。 由于在從 SELECT 語句中返回某記錄之后但在發出 UPDATE 或 DELETE 語句之前,該記錄可能已被修改,所以自動生成的 UPDATE 或 DELETE 語句包含一個 WHERE 子句,指定只有在行包含所有原始值并且尚未從數據源中刪除時,才會更新該行。 這樣做的目的是為了避免覆蓋新數據。當自動生成的 UPDATE 命令試圖更新已刪除或不包含 DataSet 中原始值的行時,該命令不會影響任何記錄,并且會引發 DBConcurrencyException。
如果要使 UPDATE 或 DELETE 在不考慮原始值的情況下完成,必須為 DataAdapter 顯式設置 UpdateCommand,而不依賴自動命令生成。