(一) 序幕
當DataSet中同時包含主/子表(主鍵表/外鍵表)時有時候關系約束太嚴格比如 關系數據庫完整性規則實體完整性 主鍵表中主鍵不准為空
參照完整性 外鍵表中外鍵的值必須與主鍵表中的主鍵對應
要麼為空要麼為主鍵表中的一主鍵值
自定義完整性
如果DataSet表中定義的多表關系約束太嚴密直接用Update方法將DataSet中多表一起提交時有可能不滿足完整性規則會發生錯誤原因 舉個例子設為兩個表 CompanyMain(公司主表)和CompanySon(公司子表)
CompanyMain(公司主表)主要存儲一個公司的基本信息CompanySon(公司子表)
主要存儲此公司的一些客戶的信息 並且公司主表中的(ID)與子表中的(BelongID)
建立關聯即主外鍵關系 一個公司對應著多個客戶即IDBelongID = n關系
主表的ID為自動生成編號
那麼在新增公司界面一起提交時系統是不會遵守數據庫完整性規則來更新到數據庫的
如果它先更新子表再更新主表有可能就會報錯 原因是主表的公司信息還沒有插入到數據庫中的表也就沒有生成公司編號 ID則子表更新時就會沒有對應的BelongID這時如果設置了 外鍵表中的外鍵不為null完整性規則就會引發異常
這只是一種出錯的可能還有更多的出錯可能性在分布式設計中更容易出現這樣的錯誤
(二) 解決辦法
一般遵守以下幾條規則就會避免大量的出錯機率
規則 在DataSet更新之前按 <表> 和 <表的RowState屬性>進行拆分提交
I 按 <表> 進行拆分提交意思是說
對DataSet 中的表不是一起提交而是一次提交一個表進行多次提交
II按 <表的RowState屬性>進行拆分提交意思是說
對DataSet中的單個表根據RowState屬性再進行拆分對RowState
相同的進行一次提交也是提交多次
規則
在規則基礎上 先更新狀態為<新增> 和 <修改> 的再更新<刪除的>
即 先更新DataRowState 值為 Added和Modified的再更新 Deleted的
規則
在規則和規則基礎上如果DataRowState為Added和Modified則先更新主表後更新子表
在規則和規則基礎上如果DataRowState為Deleted則先更新子表後更新主表
(三) 歸納一下上面三條規則如下
將DataSet中的表拆分並根據RowState將各個表記錄進行分組並存儲在不同的數據集中
//這裡要存儲在DataSet中是因為 Update接受的是DataSet的參數還有WebService只支持
//DataSet對其進行序列化操作
代碼示例
設待更新的數據集為 dsCompany(裡面包括兩個表分別為主表和子表並存儲了
數據待更新)
//dtCompanyMain存儲公司主表信息dtCompanySon存儲公司子表信息
DataTable dtCompanyMail = dsTables[dtCompanyMain]Clone() //分離出主表數據
並存儲另一對象
DataTable dtCompanySon = dsTalbes[dtCompanySon]Clone() //分離出子表數據
並存儲另一對象
DataSet dsAdded = new DataSet() //存放主表 新增 的數據
DataSet dsMidified = new DataSet() //存儲主表 編輯 的行記錄
DataSet dsDeleted = new DataSet() //存儲主表 刪除 的行記錄
dsAdded = dtCompanyMainGetChanges(DataRowStateAdded) //取得主表中新增的行
記錄集
dsMidified = dtCompanyMainGetChanges(DataRowStateModified) //取得主表中編
輯的行記錄集
dsDeleted = dtCompanyMainGetChanges(DataRowStateDeleted) //取得主表中刪除的
行記錄集
更新主表DataRowState狀態為 Added和Modified的記錄
SqlDataAdapterUpdate(dsAddeddtCompanyMain) //更新添加的記錄集到數據庫
SqlDataAdapterUpdate(dsModifieddtCompanyMain) //更新修改的記錄集到數據
庫
更新子表DataRowState狀態為 Added和Modified的記錄
…… //代碼省略跟主表更新類似
更新子表DataRowState狀態為 Deleted的記錄
…… // 代碼省略與下面類似
更新主表DataRowState狀態為 Deleted的記錄
SqlDataAdapterUpdate(dsDeleteddtCompanyMain) //更新修改的記錄集到數據庫
From:http://tw.wingwit.com/Article/program/net/201311/12582.html