国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

C#使用DataSet Datatable更新數(shù)據(jù)庫(kù)的三種實(shí)現(xiàn)方法

2020-01-24 02:27:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文以實(shí)例形式講述了使用DataSet Datatable更新數(shù)據(jù)庫(kù)的三種實(shí)現(xiàn)方法,包括CommandBuilder 方法、DataAdapter 更新數(shù)據(jù)源以及使用sql語(yǔ)句更新。分享給大家供大家參考之用。具體方法如下:

一、自動(dòng)生成命令的條件 CommandBuilder 方法

a)動(dòng)態(tài)指定 SelectCommand 屬性

b)利用 CommandBuilder 對(duì)象自動(dòng)生成 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。

c)為了返回構(gòu)造 INSERT、UPDATE 和 DELETE 。SQL CommandBuilder 必須執(zhí)行 SelectCommand。

即:必須額外經(jīng)歷一次到數(shù)據(jù)源的行程,這可能會(huì)降低性能。這也是自動(dòng)生成命令的缺點(diǎn)。

d)SelectCommand 還必須返回至少一個(gè)主鍵或唯一列.

當(dāng)CommandBuilder和DataAdapter關(guān)聯(lián)時(shí),就會(huì)自動(dòng)生成DeleteCommand、InsertCommand 和 UpdateCommand中為空的命令。即不空的不生成。

e)必須是一個(gè)表,SELECT的不能是多個(gè)表的聯(lián)合。

動(dòng)生成命令的規(guī)則:

在數(shù)據(jù)源處為表中所有 RowState 為 Added 的行插入一行(不包括標(biāo)識(shí)、表達(dá)式或時(shí)間戳等列)。
為 Modified 的行更新行(列值匹配行的主鍵列值) 。
Deleted 的行刪除行(列值匹配行的主鍵列值).這就是為什么要求條件c.d

注意:

a)因?yàn)閺腟ELECT數(shù)據(jù)到UPDATE數(shù)據(jù),中間這段時(shí)間有可能別的用戶(hù)已經(jīng)對(duì)數(shù)據(jù)進(jìn)行了修改。自動(dòng)生成命令這種UPDATE只對(duì)在行包含所有原始值并且尚未從數(shù)據(jù)源中刪除時(shí)更新。

b)自動(dòng)命令生成邏輯為獨(dú)立表生成 INSERT、UPDATE 或 DELETE 語(yǔ)句,而不考慮與數(shù)據(jù)源中其他表的任何關(guān)系。因此,當(dāng)調(diào)用 Update 來(lái)為參與數(shù)據(jù)庫(kù)中外鍵約束的列提交更改時(shí),可能會(huì)失敗。若要避免這一異常,請(qǐng)不要使用 CommandBuilder 來(lái)更新參與外鍵約束的列,而應(yīng)顯式地指定用于執(zhí)行該操作的語(yǔ)句。

下面是自動(dòng)生成命令的例子

// Assumes that connection is a valid SqlConnection object.SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM dbo.Customers", connection);SqlCommandBuilder builder = new SqlCommandBuilder(adapter);builder.QuotePrefix = "[";builder.QuoteSuffix = "]";DataSet custDS = new DataSet();connection.Open();adapter.Fill(custDS, "Customers");// Code to modify data in the DataSet here.// Without the SqlCommandBuilder, this line would fail.adapter.Update(custDS, "Customers");connection.Close();

二、使用 DataAdapter 更新數(shù)據(jù)源

需要注意:

a)如果 SelectCommand 返回 OUTER JOIN 的結(jié)果,則 DataAdapter 不會(huì)為生成的 DataTable 設(shè)置 PrimaryKey 值。您必須自己定義PrimaryKey 以確保正確解析重復(fù)行.

b)如果對(duì) DataSet、DataTable 或 DataRow 調(diào)用 AcceptChanges,則將使 DataRow 的所有 Original 值都將被重寫(xiě)為該 DataRow 的 Current 值。如果已修改將該行標(biāo)識(shí)為唯一行的字段值,那么當(dāng)調(diào)用 AcceptChanges 后,Original 值將不再匹配數(shù)據(jù)源中的值。

看看下面例子:

// Assumes connection is a valid SqlConnection.SqlDataAdapter dataAdpater = new SqlDataAdapter("SELECT CategoryID, CategoryName FROM Categories", connection);dataAdpater.UpdateCommand = new SqlCommand("UPDATE Categories SET CategoryName = @CategoryName " +"WHERE CategoryID = @CategoryID" , connection);dataAdpater.UpdateCommand.Parameters.Add("@CategoryName", SqlDbType.NVarChar, 15, "CategoryName");SqlParameter parameter = dataAdpater.UpdateCommand.Parameters.Add("@CategoryID", SqlDbType.Int);parameter.SourceColumn = "CategoryID";parameter.SourceVersion = DataRowVersion.Original;DataSet dataSet = new DataSet();dataAdpater.Fill(dataSet, "Categories");DataRow row = dataSet.Tables["Categories"].Rows[0];row ["CategoryName"] = "New Category";dataAdpater.Update(dataSet, "Categories");

插入、更新和刪除的排序

在許多情況下,以何種順序向數(shù)據(jù)源發(fā)送通過(guò) DataSet 作出的更改是相當(dāng)重要的。
例如,如果已更新現(xiàn)有行的主鍵值并且添加了具有新主鍵值的新行,則務(wù)必要在處理插入之前處理更新。

可以使用 DataTable 的 Select 方法來(lái)返回僅引用具有特定 RowState 的 DataRow 數(shù)組。然后可以將返回的 DataRow 數(shù)組傳遞到 DataAdapter 的 Update 方法來(lái)處理已修改的行。通過(guò)指定要更新的行的子集,可以控制處理插入、更新和刪除的順序。

示例如下:

DataTable table = dataSet.Tables["Customers"];// First process deletes.adapter.Update(table.Select(null, null, DataViewRowState.Deleted));// Next process updates.adapter.Update(table.Select(null, null, DataViewRowState.ModifiedCurrent));// Finally, process inserts.adapter.Update(table.Select(null, null, DataViewRowState.Added));

三、使用sql語(yǔ)句更新

例如:

cmd = new OleDbCommand(string.Format(@"insert into worker(workerid,workername,password,phoneno) values ('{0}','{1}','{2}','{3}') ", textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text),oc);oc.Open();try{ int i = cmd.ExecuteNonQuery();}catch (Exception ex){}

性能的優(yōu)劣及使用的情形,還未完全明白。

一般的,綁定bindingsource,用datatable綁定bindingsource (實(shí)質(zhì)上綁定的是datatable。defaultview,同時(shí)可用到dataview的篩選功能,但是在篩選完后,filter要重置為null,否則出現(xiàn)的一直是經(jīng)過(guò)篩選的數(shù)據(jù))

其他:

使用builder 的作用:

OleDbCommandBuilder cb = new OleDbCommandBuilder(da);

這個(gè)主要是為了讓C#自動(dòng)為OleDbDataAdapter da生成相對(duì)應(yīng)的DeleteCommand,UpdateCommand!

希望本文所述對(duì)大家的C#數(shù)據(jù)庫(kù)程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 萍乡市| 邻水| 河曲县| 宝坻区| 余姚市| 夏河县| 克东县| 莱州市| 中宁县| 遵义县| 康保县| 临江市| 巴林左旗| 和平县| 营山县| 临邑县| 新蔡县| 九寨沟县| 汶上县| 奈曼旗| 莱芜市| 金堂县| 社旗县| 晴隆县| 库伦旗| 庐江县| 竹北市| 姜堰市| 宜春市| 日喀则市| 乌兰察布市| 济源市| 广州市| 陆河县| 静安区| 吴川市| 清水县| 深泽县| 洞口县| 金昌市| 崇文区|