`
izuoyan
  • 浏览: 9219164 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用 DataAdapter 和 DataSet 更新数据库 [C#]

阅读更多
DataAdapter的Update方法可调用来将DataSet中的更改解析回数据源。与Fill方法类似,Update方法将DataSet的实例和可选的DataTable对象或DataTable名称用作参数。DataSet实例是包含已作出的更改的DataSet,而DataTable标识从其中检索更改的表。

当调用Update方法时,DataAdapter将分析已作出的更改并执行相应的命令(Insert、Update或Delete)。当DataAdapter遇到对DataRow的更改时,它将使用InsertCommand、UpdateCommand或DeleteCommand来处理该更改。这样,您就可以通过在设计时指定命令语法并在可能时通过使用存储过程来尽量提高ADO.NET应用程序的性能。在调用Update之前,必须显式设置这些命令。如果调用了Update但不存在用于特定更新的相应命令(例如,不存在用于已删除行的DeleteCommand),则将引发异常。

Command参数可用于为DataSet中每个已修改行的SQL语句或存储过程指定输入和输出值。有关更多信息,请参阅将参数用于DataAdapter。

如果DataTable映射到单个数据库表或从单个数据库表生成,则可以利用CommandBuilder对象自动生成DataAdapter的DeleteCommand、InsertCommand和UpdateCommand。有关更多信息,请参阅自动生成的命令。

Update方法会将更改解析回数据源,但是自上次填充DataSet以来,其他客户端可能已修改了数据源中的数据。若要使用当前数据刷新DataSet,请再次使用DataAdapter填充(Fill)DataSet。新行将添加到该表中,更新的信息将并入现有行。

若要处理可能在Update操作过程中发生的异常,可以使用RowUpdated事件在这些异常发生时响应行更新错误(请参阅使用DataAdapter事件),或者可以在调用Update之前将DataAdapter.ContinueUpdateOnError设置为true,然后在Update完成时响应存储在特定行的RowError属性中的错误信息(请参阅添加和读取行错误信息)。

注意如果对DataSet、DataTable或DataRow调用AcceptChanges,则将使某DataRow的所有original值被该DataRow的Current值改写。如果已修改将该行标识为唯一行的字段值,那么当调用AcceptChanges后,Original值将不再匹配数据源中的值。
以下示例演示如何通过显式设置DataAdapter的UpdateCommand来执行对已修改行的更新。请注意,在Update语句的Where子句中指定的参数设置为使用SourceColumn的original值。这一点很重要,因为Current值可能已被修改,并且可能不匹配数据源中的值。Original值是曾用来从数据源填充DataTable的值。

SqlClient

SqlDataAdaptercatDA=newSqlDataAdapter("SelectCategoryID,CategoryNameFROMCategories",nwindConn);

catDA.UpdateCommand=newSqlCommand("UpdateCategoriesSETCategoryName=@CategoryName"+
"WhereCategoryID=@CategoryID",nwindConn);

catDA.UpdateCommand.Parameters.Add("@CategoryName",SqlDbType.NVarChar,15,"CategoryName");

SqlParameterworkParm=catDA.UpdateCommand.Parameters.Add("@CategoryID",SqlDbType.Int);
workParm.SourceColumn="CategoryID";
workParm.SourceVersion=DataRowVersion.Original;

DataSetcatDS=newDataSet();
catDA.Fill(catDS,"Categories");

DataRowcRow=catDS.Tables["Categories"].Rows[0];
cRow["CategoryName"]="NewCategory";

catDA.Update(catDS);

OleDb
[C#]
OleDbDataAdaptercatDA=newOleDbDataAdapter("SelectCategoryID,CategoryNameFROMCategories",nwindConn);

catDA.UpdateCommand=newOleDbCommand("UpdateCategoriesSETCategoryName=?"+
"WhereCategoryID=?",nwindConn);

catDA.UpdateCommand.Parameters.Add("@CategoryName",OleDbType.VarChar,15,"CategoryName");

OleDbParameterworkParm=catDA.UpdateCommand.Parameters.Add("@CategoryID",OleDbType.Integer);
workParm.SourceColumn="CategoryID";
workParm.SourceVersion=DataRowVersion.Original;

DataSetcatDS=newDataSet();
catDA.Fill(catDS,"Categories");

DataRowcRow=catDS.Tables["Categories"].Rows[0];
cRow["CategoryName"]="NewCategory";
catDA.Update(catDS);

自动递增列
如果来自数据源的表包含自动递增列,则可以使用由数据源生成的值填充DataSet中的列,方法是通过以存储过程输出参数的形式返回自动递增值并将其映射到表中的一列,或者使用DataAdapter的RowUpdated事件。有关示例,请参阅检索“标识”或“自动编号”值。

但是,DataSet中的值可能会与数据源中的值不同步并导致意外的行为。例如,请考虑一个包含自动递增主键列CustomerID的表。如果在该DataSet中添加两个新客户,它们将收到自动递增的CustomerId值1和2。在向DataAdapter的Update方法传递第二个客户行时,新添加的行会收到数据源中的自动递增CustomerID值1,该值与DataSet中的值2不匹配。当DataAdapter使用返回值填充DataSet中的行时,由于第一个客户行的CustomerID已经是1,因此将发生约束冲突。

为了避免这种行为,建议在使用数据源中的自动递增列和DataSet中的自动递增列时,在DataSet中创建AutoIncrementStep为-1且AutoIncrementSeed为0的列,并确保数据源生成从1开始并以正步长值递增的自动递增标识值。这样,DataSet将为自动递增值生成负数,这些负数不会与数据源所生成的正自动递增值发生冲突。另一种方法是使用Guid类型的列而不是自动递增列。生成Guid值的算法在DataSet中生成的Guid从不会与数据源生成的Guid相同。有关定义DataTable中的列的更多信息,请参阅定义数据表的架构。

插入、更新和删除的排序
在许多情况下,以何种顺序向数据源发送通过DataSet作出的更改是相当重要的。例如,如果已更新现有行的主键值并且添加了具有新主键值的新行,则务必要在处理插入之前处理更新。

可以使用DataTable的Select方法来返回仅引用具有特定RowState的DataRow数组。然后可以将返回的DataRow数组传递到DataAdapter的Update方法来处理已修改的行。通过指定要更新的行的子集,可以控制处理插入、更新和删除的顺序。

例如,以下代码确保首先处理表中已删除的行,然后处理已更新的行,然后处理已插入的行。

[C#]
DataTableupdTable=custDS.Tables["Customers"];

//Firstprocessdeletes.
custDA.Update(updTable.Select(null,null,DataViewRowState.Deleted));

//Nextprocessupdates.
custDA.Update(updTable.Select(null,null,DataViewRowState.ModifiedCurrent));

//Finally,processinserts.
custDA.Update(updTable.Select(null,null,DataViewRowState.Added));
分享到:
评论

相关推荐

    DataAdapter是如何更新数据库数据的

    以下是一个简单的示例代码片段,演示如何使用`DataAdapter`和`CommandBuilder`更新数据库中的数据: ```csharp // 创建并配置SqlDataAdapter SqlDataAdapter da_YB = new SqlDataAdapter("SELECT * FROM 表名", ...

    C#中DataSet的用法(很详细)

    更新数据库使用DataAdapter的Update方法,它会根据数据行的状态(如已修改、新增或已删除)执行相应的SQL命令(UpdateCommand、InsertCommand和DeleteCommand)。 3. 约束和验证:DataTable的Constraints集合允许...

    怎样将DataSet中修改(增加_删除_修改)过的记录更新进数据库中

    现在,让我们来讨论一下如何使用DataAdapter对象的InsertCommand、UpdateCommand和DeleteCommand属性来更新DataSet中的记录。 如果我们需要插入一条新的记录,我们可以使用DataAdapter对象的InsertCommand属性。...

    ASP.NET数据库网站设计教程(C#版)[孙士保]第11章 使用DataSet访问数据库.ppt

    DataSet与DataAdapter协同工作,允许开发者进行常规的数据库操作,如查询、插入、更新和删除数据。 1. **DataSet和DataAdapter与数据源的关系** 数据库连接通常通过DataAdapter类建立,该类负责从数据库检索数据并...

    C#使用DataSet Datatable更新数据库的三种实现方法

    本文以实例形式讲述了使用DataSet Datatable更新数据库的三种实现方法,包括CommandBuilder 方法、DataAdapter 更新数据源以及使用sql语句更新。分享给大家供大家参考之用。具体方法如下: 一、自动生成命令的条件 ...

    C#遍历DataSet中数据的几种方法总结

    在C#编程中,`DataSet`是一个非常重要的...同时,当处理的数据涉及到数据库操作时,还可以考虑使用数据适配器(`DataAdapter`)和数据读取器(`DataReader`)等更高效的方式,尤其是在需要实时查询和更新数据的情况下。

    dataadapter

    在“AdapterTest”这个示例中,很可能包含了一个简单的C#程序,演示了如何使用DataAdapter从SQL Server数据库中检索数据并进行更新。这个程序可能包含了以下关键代码片段: ```csharp using System.Data.SqlClient;...

    C#数据库管理例子程序

    Access数据库是微软公司开发的一款关系型数据库管理系统,它以易于使用和灵活性著称,适合小型到中型企业使用。在C#中与Access数据库交互主要依赖于ADO.NET框架,这是.NET Framework的一部分,提供了与多种数据库...

    C#实验四 数据库基本操作.pdf

    本实验的主要目的是掌握ADO.NET数据库基本操作,包括通过Connection对象连接数据库、通过DataReader进行数据查询、通过DataAdapter与DataSet进行数据查询、通过Command对象进行数据操作、通过DataAdapter进行数据库...

    使用C#开发数据库应用系统 数据库 北大青鸟参考资料

    通过DataSet、DataTable、DataAdapter等组件,开发者可以在应用程序中创建离线数据视图,实现数据的缓存和持久化。 2. 数据库连接:在C#中,使用SqlConnection类可以建立到SQL Server数据库的连接。需要指定连接...

    精通C#数据库开发 精通C#数据库开发 精通C#数据库开发

    此外,`DataAdapter`是连接`DataSet`和数据库之间的桥梁,用于填充和更新数据。 SQL查询是数据库开发的基础,C#中的参数化查询可以防止SQL注入攻击,提高代码的可读性和安全性。学会使用`ExecuteScalar`、`...

    C#与数据库经典访问技术

    - **DataAdapter对象**:作为桥梁,负责在DataSet和数据库之间传递数据,用于填充DataSet和更新数据库。 - **DataSet对象**:内存中的数据集,可以包含多个DataTable,代表了离线数据。 - **DataColumn和DataRow对象...

    C#语言和数据库作业及答案

    4. **数据适配器与数据集**:了解如何使用DataAdapter和DataSet对象来填充和操作数据,实现离线数据操作。 5. **事务处理**:学习如何在C#中使用TransactionScope进行数据库事务管理,确保数据一致性。 6. **存储...

    使用C#开发数据库应用系统.rar

    在C#中,我们通常使用ADO.NET(微软的数据库访问技术)来连接和操作数据库。ADO.NET提供了一套组件,如Connection(连接)、Command(命令)、DataAdapter(数据适配器)和DataSet(数据集),它们构成了与各种...

    C#操作SQLite数据库之读写数据库的方法

    本文实例讲述了C#操作SQLite数据库之读写数据库的方法。分享给大家供大家参考,具体如下: 这里演示读写数据库并在窗体(Form)中显示其数据,其方式为: 读: Database(SQLite) -> DataAdapter -> DataSet -> ...

    c#数据库连接.ppt

    总的来说,PPT中的内容涵盖了C#中与数据库交互的基础知识,包括使用SqlCommand和SqlDataReader读取数据,利用DataSet在内存中操作数据,以及使用DataAdapter填充和更新数据。这些技能对于开发数据库相关的C#应用程序...

    C#数据库编程实例大全,包括22个经典例子

    数据库编程是C#的一个重要领域,它允许开发者与各种数据库系统(如SQL Server、MySQL、Oracle等)进行交互,实现数据的存储、检索、更新和删除等操作。本资源"《C#数据库编程实例大全》"提供了22个经典实例,旨在...

    数据集和数据库的同步-DataAdapter的使用

    `DataAdapter`是.NET Framework提供的数据访问对象,它的主要职责是填充`DataSet`和更新数据库。它通过SQL命令(SELECT, INSERT, UPDATE, DELETE)来获取、添加、修改或删除数据库中的数据,并保持`DataSet`与数据库...

Global site tag (gtag.js) - Google Analytics