winform的事物回滚问题

yujiang930 2010-12-09 09:51:54
代码如下:

PLT.BLL.SYS_PUBLIC bpub = new PLT.BLL.SYS_PUBLIC();
SqlConnection Conn = bpub.SqlConn();
SqlTransaction trans = Conn.BeginTransaction();
try
{

gFunc.SaveGridTrans(ref Conn, ref trans, ref id_Grid2, "BI_CONTACT Where C_TYPE = '1'");
gFunc.SaveGridTrans(ref Conn, ref trans, ref id_Grid3, "BI_CONTACT Where C_TYPE = '2'");
gFunc.SaveGridTrans(ref Conn, ref trans, ref id_Grid4, "BI_CARGO");
gFunc.SaveGridTrans(ref Conn, ref trans, ref id_Grid5, "BI_QUOTE");

trans.Commit();

MessageBox.Show("保存成功!");
}
catch (Exception ex)
{
trans.Rollback();
}
finally
{
if (Conn.State == ConnectionState.Open)
{
Conn.Close();
Conn.Dispose();
}
}
}


公用函数如下:

public static void SaveGridTrans(ref SqlConnection SendConn, ref SqlTransaction SendTran, ref DataSet SendDs, string Sendtbname)
{
SqlCommand sqlcmd = new SqlCommand();
SqlDataAdapter sqlada = new SqlDataAdapter();
sqlcmd.Connection = SendConn;
sqlcmd.Transaction = SendTran;
sqlcmd.CommandText = "Select * From " + Sendtbname;
sqlada.SelectCommand = sqlcmd;
SqlCommandBuilder Sqlcb = new SqlCommandBuilder(sqlada);
sqlada.Update(SendDs.Tables[0]);
SendDs.Tables[0].AcceptChanges();
}


当保存id_Grid3时,如果出错回滚,再次保存id_Grid2时就会报:
违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。

应该是id_grid2被更新过但是没有回滚,为什么会这样?如何处理
...全文
215 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yujiang930 2010-12-09
  • 打赏
  • 举报
回复
qqamoon

(龍过鸡年)

多少也给点意见撒!后面的条件去掉问题依旧

一个datatable 第一次更新成功了,回滚,再次更新就会报错!
怎么处理这个已经更新但是回滚了的数据?
注:每次保存前都会修改"操作时间"这个字段
yujiang930 2010-12-09
  • 打赏
  • 举报
回复
呵呵,被楼上的看出来了。

SKY,生成语句在保存太麻烦了,有写好的公用的函数么?
龍过鸡年 2010-12-09
  • 打赏
  • 举报
回复
楼主你也忒懒了吧,佩服哈哈!

"BI_CONTACT Where C_TYPE = '1'"
"BI_CONTACT Where C_TYPE = '2'"

这是选择查询无需使用事务处理

还有 SendDs.Tables[0].AcceptChanges() 是更新数据库的数据时才需要用的
skey123123 2010-12-09
  • 打赏
  • 举报
回复
sqlada.Update(SendDs.Tables[0]);
SendDs.Tables[0].AcceptChanges();
为什么像这样写,更新的时候,生成更新语句列表,再进行事务处理不行吗?
yujiang930 2010-12-09
  • 打赏
  • 举报
回复
一开始我也以为是同一个表的原因,后来去掉了id_grid3问题也是一样的。
skey123123 2010-12-09
  • 打赏
  • 举报
回复
更新第一条记录和第二条记录时有重叠现像,同一个表在更改时,可能会锁定,两条命令执行时,应该会报出该错误 ,你先尝试去掉这条命令
gFunc.SaveGridTrans(ref Conn, ref trans, ref id_Grid2, "BI_CONTACT Where C_TYPE = '1'");
再试一下。
yujiang930 2010-12-09
  • 打赏
  • 举报
回复
还得自己顶
yujiang930 2010-12-09
  • 打赏
  • 举报
回复
qqamoon

(龍过鸡年) 能否给个联系方式?加你详谈
yujiang930 2010-12-09
  • 打赏
  • 举报
回复
我现在就是大批量的修改数据。而且是同事保存4个表
龍过鸡年 2010-12-09
  • 打赏
  • 举报
回复
用存储过程! :)

在数据库里面创建存储过程,程序调用时只要给出:存储过程的名称及所需的参数

至于事务,一般来说单条数据不会用的,大批量数据的添加、删除、更新才会去用,因为怕在数据操作时发生断电、死机等情况。

110,536

社区成员

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

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

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