用SqlDataAdapter.Update(DataSet Ds)更新数据库.

 

一. SqlDataAdapter.Update(DataSet Ds)更新数据库.

1. DbDataAdapter调用 Update 方法时,DataAdapter 将分析已作出的更改并执行相应的命令(INSERTUPDATE DELETE)。当 DataAdapter 遇到对 DataRow 的更改时,它将使用 InsertCommandUpdateCommand DeleteCommand 来处理该更改。这样,您就可以通过在设计时指定命令语法并在可能时通过使用存储过程来尽量提高 ADO.NET 应用程序的性能。在调用 Update 之前,必须显式设置这些命令。如果调用了 Update 但不存在用于特定更新的相应命令(例如,不存在用于已删除行的 DeleteCommand),则将引发异常。
   但是如果 DataTable 映射到单个数据库表或从单个数据库表生成,则可以利用 CommandBuilder 对象自动生成 DataAdapter DeleteCommandInsertCommand UpdateCommand。为了自动生成命令,必须设置 SelectCommand 属性,这是最低的要求。SelectCommand 所检索的表架构 确定自动生成的 INSERTUPDATE DELETE 语句的语法。如果在自动生成插入、更新或删除命令后修改 SelectCommand CommandText,则可能会发生异常。如果已修改的 SelectCommand.CommandText 所包含的架构信息与自动生成插入、更新或删除命令时所使用的 SelectCommand.CommandText 不一致,则以后对 DataAdapter.Update 方法的调用可能会试图访问 SelectCommand 引用的当前表中已不存在的列,并且会引发异常。可以通过调用 CommandBuilder RefreshSchema 方法来刷新 CommandBuilder 用来自动生成命令的架构信息。
  对于DbDataAdapter.Update 方法更新数据库,每次在调用DbDataAdapter.Update(ds) 之后一定要ds.acceptchanges
  否则会对后面用到的ds出现意想不到的错误。

  郁闷~ 改了一天的程序,才发现是这个错误,太郁闷了~~

2. SqlCommandBuilder会自动生成更新、修改、删除的sql语句,进行更新。

3.当表中没有主键时,自动生成的SQL语句进行UPDate时,会出现异常信息。

  异常信息为:SqlCommandBuilder更新DataSet,遇到对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成问题。

    4.解决办法:1.    修改表的定义,定义一个主键;
2.    
SqlDataAdapter指定UpdateCommandDeleteCommandInsertCommand应该也一样);

   例子:

1.string emailSql="select email,validFlag from emailMe";
DataSet emailAdd=new DataSet();
SqlDataAdapter emailAdapter=new SqlDataAdapter(emailSql,myConn);
SqlCommandBuilder cb=new SqlCommandBuilder(emailAdapter);
emailAdapter.Fill(emailAdd,"address");
myConn.Close();
DataTable myDt=emailAdd.Tables["address"];
myDt.PrimaryKey=new DataColumn[]{myDt.Columns["email"]};
......//
修改myDs数据
emailAdapter.Update(emailAdd,"address");

     自动生成SQL语句。

2   string emailSql="select email,validFlag from emailMe";
DataSet emailAdd=new DataSet();
SqlDataAdapter emailAdapter=new SqlDataAdapter(emailSql,myConn);
SqlCommandBuilder cb=new SqlCommandBuilder(emailAdapter);
SqlCommand upCmd=new SqlCommand("update ["+strTableName+"] set validFlag=@validFlag where email=@email",myConn);
upCmd.Parameters.Add("@validFlag",SqlDbType.Int,8,"validFlag");
upCmd.Parameters.Add("@email",SqlDbType.NVarChar,100,"email");
emailAdapter.UpdateCommand=upCmd;

emailAdapter.Fill(emailAdd,"address");
myConn.Close();
......//
修改myDs数据
emailAdapter.Update(emailAdd,"address");

自定义SQL语句。

二.检索标识自动编号

 检索标识自动编号

<script type="text/Javascript"></script> 此页面仅适用于

Microsoft Visual Studio 2005/.NET Framework 2.0

同时提供下列产品的其他版本:

.NET Framework 开发人员指南

检索标识自动编号

为了确保表中的每一行都有唯一的值,可以将 DataTable 中的列设置为自动递增的主键。但是,您的应用程序可能会有多个客户端,而每个客户端都可能会使用一个单独的 DataTable 实例。在这种情况下,单独的 DataTable 实例之间最终可能会出现重复的值。由于所有客户端都使用单个数据源,因此可以让数据源定义自动递增值,从而解决这一冲突。若要完成此任务,请使用 Microsoft SQL Server 中的标识列或 Microsoft Access 中的自动编号字段。

如果使用数据源为添加到 DataSet 中的新行填充标识自动编号列,则会出现唯一的情况,因为 DataSet 与数据源之间没有直接连接。因此,DataSet 不识别任何由数据源自动生成的值。但是,对于可以创建带有输出参数的存储过程的数据源(如 Microsoft SQL Server),可以将自动生成的值(如新的标识值)指定为输出参数并使用 DataAdapter 将该值映射回 DataSet 中的相应列。

数据源可能不支持带有输出参数的存储过程。在这种情况下,将可以使用 RowUpdated 事件来检索自动生成的值,并将其放入 DataSet 中的插入行或更新行。本节包含一个示例,显示当在 Microsoft Access 2000 或更高版本上使用 Jet 4.0 OLE DB 提供程序时,如何将代码添加到 RowUpdated 事件中以确定插入是否已发生,然后检索自动生成的值并将其存储在当前更新的行中。

检索 SQL Server“标识列的值

以下存储过程和代码示例显示如何将自动递增的标识值从 Microsoft SQL Server 表映射回添加到向 DataSet 的表添加的行中的相应列。该存储过程用于将一个新行插入 Northwind 数据库的 Categories 表并以输出参数的形式返回从 Transact-SQL SCOPE_IDENTITY() 函数返回的标识值。

复制代码

CREATE PROCEDURE InsertCategory

  @CategoryName nchar(15),

  @Identity int OUT

AS

INSERT INTO Categories (CategoryName) VALUES(@CategoryName)

SET @Identity = SCOPE_IDENTITY()

InsertCategory 存储过程可以指定为 InsertCommand 的源。为接收标识输出参数创建一个参数。该参数具有 Output ParameterDirection,并将 SourceColumn 指定为 DataSet 中本地

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值