日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DataSet 的 Merge 方法

發(fā)布時間:2024/9/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DataSet 的 Merge 方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

是MSDN中對Merge方法使用說明:

Merge 方法用于合并架構(gòu)大致相似的兩個 DataSet 對象。合并在客戶端應(yīng)用程序上通常用于將數(shù)據(jù)源中最近的更改合并到現(xiàn)有的 DataSet 中。這使客戶端應(yīng)用程序能夠擁有用數(shù)據(jù)源中的最新數(shù)據(jù)刷新的 DataSet。通常在一系列過程的末尾調(diào)用 Merge 方法,這些過程涉及驗證更改、消除錯誤、使用更改更新數(shù)據(jù)源并最后刷新現(xiàn)有的 DataSet。 在客戶端應(yīng)用程序中,通常有這樣一個按鈕,用戶可以單擊它來收集已更改的數(shù)據(jù)并對其進行驗證,然后將其發(fā)送回中間層組件。在這種情況下,將首先調(diào)用 GetChanges 方法。該方法返回另一個為驗證和合并而優(yōu)化的 DataSet。第二個 DataSet 對象只包含已更改的 DataTable 和 DataRow 對象,結(jié)果產(chǎn)生初始 DataSet 的子集。該子集通常較小,因此可以更有效率地傳遞回中間層組件。然后,中間層組件將通過存儲過程使用更改更新初始數(shù)據(jù)源。然后,中間層可以發(fā)送回一個新的 DataSet,其中包含數(shù)據(jù)源中的初始數(shù)據(jù)和最新數(shù)據(jù)(通過再次運行初始查詢);或者它可以發(fā)送回包含從數(shù)據(jù)源對其進行的所有更改的子集。(例如,如果數(shù)據(jù)源自動創(chuàng)建唯一主鍵值,則可以將這些值傳播回客戶端應(yīng)用程序。)在哪一種情況下都可以使用 Merge 方法將返回的 DataSet 合并回客戶端應(yīng)用程序的初始 DataSet。 當(dāng)將新的源 DataSet 合并到目標(biāo)中時,DataRowState 值為 Unchanged、Modified 或 Deleted 的任何源行都會與具有同一主鍵值的目標(biāo)行相匹配。DataRowState 值為 Added 的源行將匹配主鍵值與新源行相同的新目標(biāo)行。

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

在SQL Server下的一個Products表結(jié)構(gòu)如下:

在SQL Server下的一個Products表結(jié)構(gòu)如下:

列名

數(shù)據(jù)類型

說明

Code

nchar

產(chǎn)品代碼(主鍵列)

Name

nvarchar

產(chǎn)名名稱

UnitPrice

numeric

產(chǎn)品單價

在.NET中使用XSD生成一個對應(yīng)的ProductsData.xsd結(jié)構(gòu)如下:

列名

數(shù)據(jù)類型

說明

Code

string

產(chǎn)品代碼(主鍵列)

Name

string

產(chǎn)名名稱

UnitPrice

decimal

產(chǎn)品單價

根據(jù)MSDN的說明,我們在前臺通過ProductsData添加或修改數(shù)據(jù)后在提交后臺更新時,通常做法如下:

??????? // 創(chuàng)建一個新數(shù)據(jù)集來保存對主數(shù)據(jù)集所做的更改

??????? ProductsData dataSetChanges;

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

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

??????? if(dataSetChanges != null) {

??????????? try {

??????????????? // 需要做一些更改,所以嘗試通過調(diào)用 update 方法

// 和傳遞數(shù)據(jù)集以及任何參數(shù)來更新數(shù)據(jù)源

??????????????? UpdateDataSource(dataSetChanges);

??????????????? productsData.Merge(dataSetChanges);

??????????????? productsData.AcceptChanges();

??????????? }

??????????? catch (System.Exception eUpdate) {

??????????????? throw eUpdate;

??????????? }

??????? }

以上代碼是根據(jù)VS.NET的數(shù)據(jù)窗體生成向?qū)懙?#xff0c;依據(jù)以上代碼我們模擬向數(shù)據(jù)集添加一行數(shù)據(jù)并更新后的情況:

Code

Name

UnitPrice

1001

金砂朱古力

120.00

沒問題,下面我們修改這行數(shù)據(jù)再更新,這里我們把Code改為1002,更新之后結(jié)果數(shù)據(jù)并沒有按我們預(yù)想的把原本行Code列的值1001改為1002,而是添加了一行:

Code

Name

UnitPrice

1001

金砂朱古力

120.00

1002

金砂朱古力

130.00

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

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

既然要用Merge方法,那只有依Merge合并數(shù)據(jù)的原理去做,不讓改主鍵我們就不改主鍵,我們可以給前臺的ProductsData的數(shù)據(jù)集加多一個額外的主鍵ID列,并把它的AutoIncrement設(shè)為true,將原本的主鍵列Code改為Key列,至于后臺SQL Server中的源表不作任何修改,修改后如下:

列名

數(shù)據(jù)類型

說明

ID

Int

自動增長列 (主鍵)

Code

String

產(chǎn)品代碼?? (key 鍵)

Name

String

產(chǎn)名名稱

UnitPrice

decimal

產(chǎn)品單價

經(jīng)這樣一改,由于ID是自動一個自遞增列,我們并不去修改它的值,這樣我們就可以隨意更改 Code 列的值了,Merge 方法在合并數(shù)據(jù)時由于是依據(jù)ID例進行比對所以也不會再出現(xiàn)前面加多一行的問題了。

總結(jié)

以上是生活随笔為你收集整理的DataSet 的 Merge 方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。