首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> 数据库教程
使用 DataAdapter 和 DataSet 更新数据库 [C#]-.NET教程,数据库应用
作者:网友供稿 点击:42
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
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
[visual basic]
dim catda as sqldataadapter = new sqldataadapter("select categoryid, categoryname from categories", nwindconn)

catda.updatecommand = new sqlcommand("update categories set categoryname = @categoryname " & _
                                     "where categoryid = @categoryid", nwindconn)

catda.updatecommand.parameters.add("@categoryname", sqldbtype.nvarchar, 15, "categoryname")

dim workparm as sqlparameter = catda.updatecommand.parameters.add("@categoryid", sqldbtype.int)
workparm.sourcecolumn = "categoryid"
workparm.sourceversion = datarowversion.original

dim catds as dataset = new dataset
catda.fill(catds, "categories")  

dim crow as datarow = catds.tables("categories").rows(0)
crow("categoryname") = "new category"

catda.update(catds)
[c#]
sqldataadapter catda = new sqldataadapter("select categoryid, categoryname from categories", nwindconn);       

catda.updatecommand = new sqlcommand("update categories set categoryname = @categoryname " +
                                     "where categoryid = @categoryid" , nwindconn);

catda.updatecommand.parameters.add("@categoryname", sqldbtype.nvarchar, 15, "categoryname");

sqlparameter workparm = catda.updatecommand.parameters.add("@categoryid", sqldbtype.int);
workparm.sourcecolumn = "categoryid";
workparm.sourceversion = datarowversion.original;

dataset catds = new dataset();
catda.fill(catds, "categories");   

datarow crow = catds.tables["categories"].rows[0];
crow["categoryname"] = "new category";

catda.update(catds);
oledb
[visual basic]
dim catda as oledbdataadapter = new oledbdataadapter("select categoryid, categoryname from categories", nwindconn)       

catda.updatecommand = new oledbcommand("update categories set categoryname = ? " & _
                                       "where categoryid = ?" , nwindconn)

catda.updatecommand.parameters.add("@categoryname", oledbtype.varchar, 15, "categoryname")

dim workparm as oledbparameter = catda.updatecommand.parameters.add("@categoryid", oledbtype.integer)
workparm.sourcecolumn = "categoryid"
workparm.sourceversion = datarowversion.original

dim catds as dataset = new dataset
catda.fill(catds, "categories")    

dim crow as datarow = catds.tables("categories").rows(0)
crow("categoryname") = "new category"

catda.update(catds)
[c#]
oledbdataadapter catda = new oledbdataadapter("select categoryid, categoryname from categories", nwindconn);            

catda.updatecommand = new oledbcommand("update categories set categoryname = ? " +
                                       "where categoryid = ?" , nwindconn);

catda.updatecommand.parameters.add("@categoryname", oledbtype.varchar, 15, "categoryname");

oledbparameter workparm = catda.updatecommand.parameters.add("@categoryid", oledbtype.integer);
workparm.sourcecolumn = "categoryid";
workparm.sourceversion = datarowversion.original;

dataset catds = new dataset();
catda.fill(catds, "categories");    

datarow crow = catds.tables["categories"].rows[0];
crow["categoryname"] = "new category";
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 方法来处理已修改的行。通过指定要更新的行的子集,可以控制处理插入、更新和删除的顺序。

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

[visual basic]
dim updtable as datatable = custds.tables("customers")

first process deletes.
custda.update(updtable.select(nothing, nothing, dataviewrowstate.deleted))

next process updates.
custda.update(updtable.select(nothing, nothing, dataviewrowstate.modifiedcurrent))

finally, process inserts.
custda.update(updtable.select(nothing, nothing, dataviewrowstate.added))
[c#]
datatable updtable = custds.tables["customers"];

// first process deletes.
custda.update(updtable.select(null, null, dataviewrowstate.deleted));

// next process updates.
custda.update(updtable.select(null, null, dataviewrowstate.modifiedcurrent));

// finally, process inserts.
custda.update(updtable.select(null, null, dataviewrowstate.added));

文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·jsp留言板源代码4-JSP教程,数据库相关
·“脱衣秀”泛滥 四川打击淫秽色情视频聊天室
·c#中使用 crystal reports (水晶报表)的打包和部署问题-.NET教程,报表/图形/Office
·MDAC2.8 下载!-ASP教程,数据库相关
·数据库安装包的制作(参考MSDN)-.NET教程,安装和部署
·asp讲座之七:asp与数据库(二)
·深度和广度优先分油问题(C#实现)-.NET教程,C#语言
·C#在状态栏中,自绘进度条,-.NET教程,C#语言
·怎么清除sql server日志
·C#中的接口-.NET教程,C#语言
最新文章
·sql server 2005 ce基础概要_数据库教程
·用flash as代码制作按钮弹出窗口_flash教程
·alexa:戏曲性地调整_alexa排名
·google也推出域名注册_google推广
·技巧总结:div中class与id的区别及应用_css教程
·windows vista命令runas.exe全解析_windows vista
·photoshop将美女照片处理成仿古斑驳油画_photoshop教程
·百度主题推广代码的完全解析-知己知彼_网赚技巧
·你的google adsense帐号是否被人盗用?_网赚技巧
·如何挑出google adsense中单价极低的广告商_网赚技巧
相关主题
  • 使用 dataadapter 执行批量更新_ado.net应用
  • 使用 DataAdapter 和 DataSet 更新数据库-.NET教程,数据库应用
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭