C#处理事务过程中突然弹出一个MessageBox怎么办?

leitnt 2010-11-21 12:04:00

private void A()
{
SqlConnection conn = new SqlConnection(
"server=.;" +
"database=TLTL;" +
"uid=sa;" +
"pwd=");
conn.Open();

SqlCommand sqlCmd = new SqlCommand();
sqlCmd.Connection = conn;

sqlCmd.Transaction = conn.BeginTransaction();

if (!B(conn, sqlCmd))
{
sqlCmd.Transaction.Rollback();
return;
}

sqlCmd.Transaction.Commit();
MessageBox.Show("操作完毕!");
}

private bool B(SqlConnection conn, SqlCommand sqlCmd)
{
if ( ... )
{
if (!C(conn, sqlCmd))
{
MessageBox.Show("B中发生错误");
return false;
}
else
{
return true;
}
}
else
{
// ...
}
}

private bool C(SqlConnection conn, SqlCommand sqlCmd)
{
if ( ... )
{
MessageBox.Show("C中发生错误!");
return false;
}
else
{
sqlCmd.CommandText = "....";
sqlCmd.ExecuteNonQuery();
}
}


如果程序执行到B或C满足某个条件,会弹出消息,此时事务中断,如果用户不点“OK”,那么其他用户就无法使用数据库,请教高手怎么解决这个问题?发生错误时,既要及时回滚事务,又要根据错误发生的位置显示相应信息。
...全文
98 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunnj87 2010-11-21
  • 打赏
  • 举报
回复
一般只要告诉用户操作失败就OK了吧。出错了事务回滚,然后打好log就行吧
leitnt 2010-11-21
  • 打赏
  • 举报
回复
这里可能我说的不太准确,也许这样更准确些

private void A()
{
SqlConnection conn = new SqlConnection(
"server=.;" +
"database=TLTL;" +
"uid=sa;" +
"pwd=");
conn.Open();

SqlCommand sqlCmd = new SqlCommand();
sqlCmd.Connection = conn;

sqlCmd.Transaction = conn.BeginTransaction();

if (!B(conn, sqlCmd))
{
sqlCmd.Transaction.Rollback();
return;
}

sqlCmd.Transaction.Commit();
MessageBox.Show("操作完毕!");
}

private bool B(SqlConnection conn, SqlCommand sqlCmd)
{
if (!条件1)
{
if (!C(conn, sqlCmd))
{
MessageBox.Show("条件1不满足,不能保存");
return false;
}
else
{
return true;
}
}
else
{
// ...
}
}

private bool C(SqlConnection conn, SqlCommand sqlCmd)
{
if (!条件2)
{
MessageBox.Show("条件2不满足,不能保存!");
return false;
}
else
{
sqlCmd.CommandText = "....";
sqlCmd.ExecuteNonQuery();
}
}


这里不是异常,而是逻辑判断,只是当MessageBox弹出后,如果用户不点“OK”,事务就不能运行下去;如果去掉这两个MessageBox,事务可以正常回滚,但不能判断究竟是不满足条件几导致事务回滚。
后来我想到一个办法:定义一个string变量strMsg,当条件1或条件2不满足时,将提示信息赋给strMsg,A()函数回滚事务之后,再MessageBox(strMsg)。不知道这样的办法好不好。
Ki1381 2010-11-21
  • 打赏
  • 举报
回复
最简单的做法是B,C里什么都不用管,当它正常的做,在A中用try catch结构,万一有错在catch里回滚。
  • 打赏
  • 举报
回复
基本上你所描述的那种涉及到的是对抛出异常机制的编程知识的空白。执行业务逻辑的程序错误应该抛出异常,而不是MessageBox.Show。显示异常信息根本不是业务逻辑处理的事,而是表现层要做的事。
  • 打赏
  • 举报
回复
[Quote=引用楼主 leitnt 的回复:]
C# code

private void A()
{
SqlConnection conn = new SqlConnection(
"server=.;" +
"database=TLTL;" +
……
[/Quote]

每一个事务都应该在2、3秒钟内完成,即使用户去上厕所了(离开了)也是一样。这是一个使用事务的基本规则。

110,561

社区成员

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

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

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