OOOOOOO高手请进,更新数据库问题OOOOOOO

LearnH 2002-12-12 09:19:45
我用ADO.NET编写数据库处理程序,当调用DataAdapter.Update()时,如果发生并发冲突(源表数据已改变),更新就会错误,如果我想采用最好更新生效应该怎么做,谢谢
...全文
39 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dy_2000_abc 2002-12-13
  • 打赏
  • 举报
回复
上面的代码只限于自动生成语句,因为自动生成语句前,CommandBuilder需要到数据库取回元数据用于更新操作。
dy_2000_abc 2002-12-13
  • 打赏
  • 举报
回复
不好意思,今天想更正一下,没想到结贴了,正如你所说,我上面的代码是不对的,改成这样就可以了,它可以保证在selectCommand取数据到更新结束这段时间锁定取出的数据:

OleDbDataAdapter dda=new OleDbDataAdapter("...",conn);
OleDbCommandBuilder builder=new OleDbCommandBuilder(dda);
OleDbTransaction tran = Conn.BeginTransaction();
tran.IsolationLevel=System.Data.IsolationLevel.RepeatableRead;
daa.SelectCommand.Transaction=tran;
builder.GetDeleteCommand().Transaction=tran;
builder.GetDeleteCommand().Transaction=tran;
try
{
dda.Update(ds,"customers");
tran.Commit();
}
catch
{
tran.Rollback();
}
dy_2000_abc 2002-12-12
  • 打赏
  • 举报
回复
建议还是手工写Command,因为使用SqlCommandBuilder自动生成Command需要一个额外的数据库来回,这会导致性能降低。如果使用自动生成语句,你可以为更新语句定义事务,使得其他用户或进程在这个时间无法修改读取的数据,比如:
OleDbDataAdapter dda;
OleDbCommandBuilder builder=new OleDbCommandBuilder(dda);
builder.GetDeleteCommand().Connection.Open();
OleDbTransaction tran=builder.GetDeleteCommand().Connection.BeginTransaction();
tran.IsolationLevel=System.Data.IsolationLevel.RepeatableRead;
builder.GetDeleteCommand().Transaction=tran;
try
{
dda.Update(ds,"customers");
tran.Commit();
}
catch
{
tran.Rollback();
}
LearnH 2002-12-12
  • 打赏
  • 举报
回复
高手快帮忙呵
LearnH 2002-12-12
  • 打赏
  • 举报
回复
可我是直接使用DataAdapter的Update(),UpdateCommand是由SqlCommandBuilder生成的(好多个表,我不想每个表的Command都手工写出来),
这样DataAdapter就不是根据Timetamp来判断的,而是判断初始值,有没有办法让DataAdapter在发生冲突时强行更新记录?
jerryfangsh 2002-12-12
  • 打赏
  • 举报
回复
使用Timptamp。然后使用开发性并发冲突。
例如:
表:table
字段:id char(36),f_name char(10),l_name char(10),tamp timetamp

更新的SQL语句:
update table set id=@id,f_name=@fname,l_name=@lname where tamp=@tamp

在生成UpdateCommand时,指定tamp字段的DataRowVersion为Original。
LearnH 2002-12-12
  • 打赏
  • 举报
回复
事务处理只是在提交事务的时候才锁定记录,但是我的记录是早已经读取出来了,用户在对数据浏览后对数据进行修改(可能在浏览的时候别的用户已经修改了源表数据),保存的时候就会发生错误,这与事务处理已经没有关系了,因为其他用户对数据源的修改是在我读取记录后提交事务之前进行的

111,117

社区成员

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

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

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