DataSet 的 Merge 方法研究

來源:互聯網
上載者:User
在ADO.NET中我們在合并兩個相同或相近的DataSet對象時,通常會使用DataSet的Merge方法,該方法有多個重載版本,在介紹它之前我們先複習Merge方法,以下是MSDN中對Merge方法使用說明:



Merge 方法用於合并架構大致相似的兩個 DataSet 對象。合并在用戶端應用程式上通常用於將資料來源中最近的更改合并到現有的 DataSet 中。這使用戶端應用程式能夠擁有用資料來源中的最新資料重新整理的 DataSet。通常在一系列過程的末尾調用 Merge 方法,這些過程涉及驗證更改、消除錯誤、使用更改更新資料來源並最後重新整理現有的 DataSet。

在用戶端應用程式中,通常有這樣一個按鈕,使用者可以單擊它來收集已更改的資料並對其進行驗證,然後將其發送回中介層組件。在這種情況下,將首先調用 GetChanges 方法。該方法返回另一個為驗證和合并而最佳化的 DataSet。第二個 DataSet 對象只包含已更改的 DataTable 和 DataRow 對象,結果產生初始 DataSet 的子集。該子集通常較小,因此可以更有效率地傳遞迴中介層組件。然後,中介層組件將通過預存程序使用更改更新初始資料來源。然後,中介層可以發送回一個新的 DataSet,其中包含資料來源中的初始資料和最新資料(通過再次運行初始查詢);或者它可以發送回包含從資料來源對其進行的所有更改的子集。(例如,如果資料來源自動建立唯一主索引值,則可以將這些值傳播回用戶端應用程式。)在哪一種情況下都可以使用 Merge 方法將返回的 DataSet 合并回用戶端應用程式的初始 DataSet。

當將新的源 DataSet 合并到目標中時,DataRowState 值為 Unchanged、Modified 或 Deleted 的任何源行都會與具有同一主索引值的目標行相匹配。DataRowState 值為 Added 的源行將匹配主索引值與新源行相同的新目標行。


根據以上說明,我們知道Merge方法在合并兩個資料集時,是以行的主索引值為主要對比參照。這樣在向資料集添加新行時不會有任何問題,在修改了行且不修改主索引值的情況下也不會有問題,但是在更改行時如果你修改了主鍵的值,那問題就來了…… 下面我們就舉例說明:

在SQL Server下的一個Products表結構如下:

列名
資料類型
說明

Code
nchar
產品代碼(主鍵列)

Name
nvarchar
產名名稱

UnitPrice
numeric
產品單價


在.NET中使用XSD產生一個對應的ProductsData.xsd結構如下:

列名
資料類型
說明

Code
string
產品代碼(主鍵列)

Name
string
產名名稱

UnitPrice
decimal
產品單價


根據MSDN的說明,我們在前台通過ProductsData添加或修改資料後在提交後台更新時,通常做法如下:

// 建立一個新資料集來儲存對主要資料集所做的更改

ProductsData dataSetChanges;

dataSetChanges = (ProductsData)(productsData.GetChanges());

// 檢查是否做了任何更改

if(dataSetChanges != null) {

try {

// 需要做一些更改,所以嘗試通過調用 update 方法

// 和傳遞資料集以及任何參數來更新資料來源

UpdateDataSource(dataSetChanges);

productsData.Merge(dataSetChanges);

productsData.AcceptChanges();

}

catch (System.Exception eUpdate) {

throw eUpdate;

}

}

以上代碼是根據VS.NET的資料表單產生嚮導寫的,依據以上代碼我們類比向資料集添加一行資料並更新後的情況:

Code
Name
UnitPrice

1001
金砂朱古力
120.00


沒問題,下面我們修改這行資料再更新,這裡我們把Code改為1002,更新之後結果資料並沒有按我們預想的把原本行Code列的值1001改為1002,而是添加了一行:

Code
Name
UnitPrice

1001
金砂朱古力
120.00

1002
金砂朱古力
130.00


註:通常情況下我們是很少更改主索引值,但在代碼沒有被使用的情況下,一般是允許更改Code的,特別是在系統實施的階段。

出現以上問題的原因其實不奇怪,按Merge方法的原理,這一點也沒錯,但這是我們不希望的結果,怎麼解決呢,難道不允許使用者更改主鍵,但好象不符合實際。怎麼解決呢?

既然要用Merge方法,那隻有依Merge合并資料的原理去做,不讓改主鍵我們就不改主鍵,我們可以給前台的ProductsData的資料集加多一個額外的主鍵ID列,並把它的AutoIncrement設為true,將原本的主鍵列Code改為Key列,至於後台SQL Server中的源表不作任何修改,修改後如下:

列名
資料類型
說明

ID
Int
自動成長列 (主鍵)

Code
String
產品代碼 (key 鍵)

Name
String
產名名稱

UnitPrice
decimal
產品單價


經這樣一改,由於ID是自動一個自遞增列,我們並不去修改它的值,這樣我們就可以隨意更改 Code 列的值了,Merge 方法在合并資料時由於是依據ID例進行比對所以也不會再出現前面加多一行的問題了。

後記:這是我寫的 Blog 申請好之後寫的第一篇有關技術的文章,自已感覺寫的有點羅嗦,其實寫那麼長有用的只是最後的幾行,這可能對那些.NET高手們只是雕蟲小技,所以讓高手們見笑了。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。