电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> 数据库
使用 dataadapter 和 dataset 更新数据库 [c#]-.net教程,数据库应
作者:网友供稿 点击:8
  西部数码-全国虚拟主机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.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·数据库开发个人总结(ADO.NET小结)-.NET教程,数据库应用
·怎么由DataSet将数据导入Excel?-.NET教程,数据库应用
·动态创建SQL Server数据库、表、存储过程-ASP教程,数据库相关
·Win32环境下动态链接库(DLL)编程原理-.NET教程,数据库应用
·封装的ADO.NET对数据库操作经典类-.NET教程,数据库应用
·在DataGridView中获得DataGridViewCheckBoxColumn的状态-ASP教程,数据库相关
·DataGrid使用心得(附大量代码)-ASP教程,数据库相关
·用代码创建DataGrid的多链接及checkbox事件响应-.NET教程,数据库应用
·ADO.NET 的最佳实践技巧-.NET教程,数据库应用
·转载: 用纯ASP代码实现图片上传并存入数据库中

最新文章
·根据数据表中数据,生成Powerpoint幻灯片-ASP教程,数据库相关
·DataGrid中的按钮反选事件与NamingContainer(命名容器)-downmoon-ASP教程,数据库相关
·使用用VB处理MYSQL数据库中二进制数据问题-.NET教程,VB.Net语言
·关于DataGridView中如何接收处于编辑状态下的当前信息-ASP教程,数据库相关
·在DataGridView中获得DataGridViewCheckBoxColumn的状态-ASP教程,数据库相关
·.net下访问Access数据库需要注意的问题-.NET教程,Asp.Net开发
·ActiveMQ4.1+Spring2.0的POJO JMS方案(上)-.NET教程,数据库应用
·ASP.NET 2.0中直接将Access数据库导入到Excel文件中-.NET教程,Asp.Net开发
·NET(C#)连接各类数据库-集锦-.NET教程,C#语言
·ASP.NET2.0连接SQL Server数据库详解-.NET教程,Asp.Net开发




版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号