有谁知道当用SqlDataAdapter.Update()更新数据库时,抛出的异常(并发冲突:UpdateCommand 影响 0 个记录)是如何产生的?

boyfling 2004-08-31 09:16:11
有谁知道当用SqlDataAdapter.Update()更新数据库时,抛出的异常(并发冲突:UpdateCommand 影响 0 个记录)是如何产生的?

代码如下:
...
DataTable dt = new DataTable();
sqlDataAdapter.Fill( dt );

SqlCommand sqlCommandUpdate = sqlCon.CreateCommand();
sqlCommandUpdate.CommandText = "update table1 set aaa=@aaa,bbb=@bbb,ccc=@ccc " +
"where (aaa=@aaa_) and (bbb=@bbb_) and (ccc=@ccc_)";
sqlCommandUpdate.Parameters.Add( "@aaa", SqlDbType.Int, 10, "aaa" );
sqlCommandUpdate.Parameters.Add( "@bbb", SqlDbType.Char, 50, "bbb" );
sqlCommandUpdate.Parameters.Add( "@ccc", SqlDbType.VarChar, 50, "ccc" );

sqlCommandUpdate.Parameters.Add( "@aaa_", SqlDbType.Int, 10, "aaa" );
sqlCommandUpdate.Parameters["@aaa_"].SourceVersion = DataRowVersion.Original;
sqlCommandUpdate.Parameters.Add( "@bbb_", SqlDbType.Char, 50, "bbb" );
sqlCommandUpdate.Parameters["@bbb_"].SourceVersion = DataRowVersion.Original;
sqlCommandUpdate.Parameters.Add( "@ccc_", SqlDbType.VarChar, 50, "ccc" );
sqlCommandUpdate.Parameters["@ccc_"].SourceVersion = DataRowVersion.Original;

sqlDataAdapter.UpdateCommand = sqlCommandUpdate;

dt.Rows[0]["ccc"] = DateTime.Now.ToLongTimeString();

sqlDataAdapter.Update( dt );
...
...全文
514 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gmki 2004-09-08
  • 打赏
  • 举报
回复
sqlCommandUpdate.Parameters["@ccc_"].SourceVersion = DataRowVersion.Original;
使用的是original值,但是dt.Rows[0]["ccc"] = DateTime.Now.ToLongTimeString();
用的是current值,update时会检查datarowversion;
我认为你应该;
sqlCommandUpdate.Parameters["@ccc_"].SourceVersion = DataRowVersion.CURRENT;

boyfling 2004-08-31
  • 打赏
  • 举报
回复
To bruce007(蜀人):
照你说的我改了,确实通过了。
但是我加上
dt.Rows[0]["aaa"] = 1;
程序还是运行正确。照你说的aaa和ccc一样的啊,在where前面和后面都有,而且都是重新赋值啊。
zhpsam109 2004-08-31
  • 打赏
  • 举报
回复
QQ:253159246
bruce007 2004-08-31
  • 打赏
  • 举报
回复
还有别的用法就是在乐观锁定。 会加一个额外的字段就想你这种用法, 只不过程序要显示的捕捉这个error, 用来表示别人有更新
bruce007 2004-08-31
  • 打赏
  • 举报
回复
你要把where 中的那个 (ccc=@ccc_) 拿掉才行。 你想想你将ccc 重新都赋值成 DateTime.Now.ToLongTimeString(); 它还会等于原来的值吗? 不等的话, 找不到合适的row, 当然只有更新0条了。 一般来将那个where后面加的都是主键。
boyfling 2004-08-31
  • 打赏
  • 举报
回复
我没有用CommandBuilder
就是给UpdateCommand添加SQL来实现得,但是就是出这个问题。
还有就是我如果把数据库中的ccc这个列删了,然后代码里面做相应修改,就可以正常通过,我真的很迷惑。

主键也加了 但是还是不行
zhpsam109 2004-08-31
  • 打赏
  • 举报
回复
1.如果你的select 命令中包含Primary Key,那么,你可以使用我在blog中说的填充架构的方法!

2.如果你的select不包含Primary Key,那么,你不能使用CommandBuilder来为适配器产生updateCommand等,你可以用我在blog中说的填充架构的方法!另外,你也可以使用为适配器增加表映射的方法! 这个方法可以使你利用从一个适配器(da1)填充的数据集(ds1)利用令一个适配器(da2)的update方法更新到数据源!
zhpsam109 2004-08-31
  • 打赏
  • 举报
回复
我也曾经遇到这样的问题,祝你早日解决!

我的MSN:zhanghaopeng289@msn.com大家一起进步!
zhpsam109 2004-08-31
  • 打赏
  • 举报
回复
where 后面的参数写法参考:

Com.Parameters.Add(new OleDbParameter("@p1",System.Data.OleDb.OleDbType.Decimal));
Com.Parameters[0].SourceColumn="AMOUNTSUM";
Com.Parameters[0].SourceVersion=DataRowVersion.Original;

where前面的参数:
Com.Parameters.Add(new OleDbParameter("@p",System.Data.OleDb.OleDbType.VarChar));
Com.Parameters[1].SourceColumn="paymonth";
Com.Parameters[1].SourceVersion=DataRowVersion.Current;
zhpsam109 2004-08-31
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhpsam109/archive/2004/08/29/87934.aspx
zhpsam109 2004-08-31
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3273/3273102.xml?temp=.6940424

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧