事务执行不正确

heli_1005 2013-07-12 11:15:14
以下是aspx.cs中的代码。是主从关系的表的添加功能,一个主表,多个从表。所以我把事务用在aspx.cs里面。但是,有时候主表添加成功,从表添加失败,事务不起作用,错哪里了呢?
  
public string Constr = System.Configuration.ConfigurationManager.AppSettings["sqlConn.ConnectionString"].ToString();

public void tranClas()
{

using (SqlConnection con = new SqlConnection(Constr))
{
con.Open();
SqlTransaction ts = con.BeginTransaction();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.Transaction = ts;
try
{
Ent_Class_Profile claPro = new Ent_Class_Profile();
Ent_Class_Detail detail = new Ent_Class_Detail();
string str = Request.QueryString["data"].ToString();
JieXiJson[] jsda = new JavaScriptSerializer().Deserialize<JieXiJson[]>(str);

claPro.Category_ID = jsda[0].dlCourse;
claPro.Category_2nd_ID = jsda[0].dlSort;
claPro.Attendee_min = jsda[0].Attendee_min;
claPro.Attendee_Max = jsda[0].Attendee_Max;
claPro.Forct_Date =Convert.ToDateTime(jsda[0].Forct_Date);
claPro.Class_Qty = jsda[0].Class_Qty;
claPro.Class_Points = jsda[0].Class_Points;
claPro.Status = jsda[0].rds;
claPro.Publish_Date =Convert.ToDateTime(jsda[0].Publish_Date);

//添加主表class
bool bclas = tb.TranPlanClass(claPro);
// 得到此时最大classid
int clasId = tb.MaxClassId();
for (int i = 1; i <(claPro.Class_Qty+1); i++)
{
detail.Class_ID = clasId;
detail.Class_Sequence = jsda[i].Class_Sequence;
detail.Class_Time_Begin =Convert.ToDateTime(jsda[i].Class_Time_Begin.ToString());
detail.Class_Time_End = Convert.ToDateTime(jsda[i].Class_Time_End.ToString());
detail.Course_Code = jsda[i].Course_Code;
detail.Teacher_ID = jsda[i].Teacher_ID;
//添加从表classDetail
bool bdetai = tb.TranPlanClassDetail(detail);

}
ts.Commit();
}
catch(Exception)
{
if (ts != null)
{
ts.Rollback();
}
throw;
}
finally
{
if (ts != null)
{
con.Close();
}
}
...全文
181 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
byxxw 2013-07-12
  • 打赏
  • 举报
回复
SqlCommand cmd = new SqlCommand(); cmd.Connection = con; cmd.Transaction = ts; 你的transaction是关联到cmd上的,怎么没看cmd的调用,你是用的tb这个变量的调用,也不知道tb.xxx的方法里有没有事务处理
heli_1005 2013-07-12
  • 打赏
  • 举报
回复
引用 1 楼 lhx527099095 的回复:
个人建议复杂逻辑 运用事务的 都放到存储过程里解决 数据库会帮你搞定 你只要调用存储过程即可。。。。
那这个错哪里了呢?
lhx527099095 2013-07-12
  • 打赏
  • 举报
回复
个人建议复杂逻辑 运用事务的 都放到存储过程里解决 数据库会帮你搞定 你只要调用存储过程即可。。。。
heli_1005 2013-07-12
  • 打赏
  • 举报
回复
引用 7 楼 likevs 的回复:
老弟,你该回去看下ADO.NET语言书籍了 事务对象你都不了解它的工作机制。在这里也不好一下子全说明白给你。 cmd.Transaction = ts; // 看这个,知道为什么要把事务对象赋值给cmd对象不? 我这样比喻吧,把ts事务比喻成一个奶妈,那么,cmd就相当于一个孩子,归她管 所以,你要想让这个奶妈统一给这些孩子喂奶,那么,就得先把这些孩子都给她去管理。 例子: cmd1.Transaction = ts; . . . cmd2.Transaction = ts; . . . cmd3.Transaction = ts; . . . ts.Commit(); // 再看这里,这里是总控制了,也就是说,执行这个时,奶妈将会把绑定好的所有孩子(cmd1 cmd2 cmd3 ...........) 的所有的SQL语句都提交到数据库去执行(当然,事实上并不这么简单,不过你先别去理解它个,后面再理解,先理解事务的调用方式先)。 常规事务的使用条件: 一个事务ts只专属于同一个连接con,也就是我们说的会话环境,然后,该事务里允许一个或多个命令cmd 说简单一些的话,就是:多个cmd共用同一个con,而与这个con绑定的ts负责在所有cmd模拟执行成功时,提交转变为真正的执行,当发现不是所有cmd都成功时,则回滚已成功的操作
我不是老弟,我是老姐。
byxxw 2013-07-12
  • 打赏
  • 举报
回复
你上面写的事务处理没有问题,只是你又用tb的方法进行操作了,所以出了问题, 把上面的事务操作方式运用到你tb方法里,让两个方法共用一个transaction对象就可以了 可以参考楼上的
likevs 2013-07-12
  • 打赏
  • 举报
回复
老弟,你该回去看下ADO.NET语言书籍了 事务对象你都不了解它的工作机制。在这里也不好一下子全说明白给你。 cmd.Transaction = ts; // 看这个,知道为什么要把事务对象赋值给cmd对象不? 我这样比喻吧,把ts事务比喻成一个奶妈,那么,cmd就相当于一个孩子,归她管 所以,你要想让这个奶妈统一给这些孩子喂奶,那么,就得先把这些孩子都给她去管理。 例子: cmd1.Transaction = ts; . . . cmd2.Transaction = ts; . . . cmd3.Transaction = ts; . . . ts.Commit(); // 再看这里,这里是总控制了,也就是说,执行这个时,奶妈将会把绑定好的所有孩子(cmd1 cmd2 cmd3 ...........) 的所有的SQL语句都提交到数据库去执行(当然,事实上并不这么简单,不过你先别去理解它个,后面再理解,先理解事务的调用方式先)。 常规事务的使用条件: 一个事务ts只专属于同一个连接con,也就是我们说的会话环境,然后,该事务里允许一个或多个命令cmd 说简单一些的话,就是:多个cmd共用同一个con,而与这个con绑定的ts负责在所有cmd模拟执行成功时,提交转变为真正的执行,当发现不是所有cmd都成功时,则回滚已成功的操作
heli_1005 2013-07-12
  • 打赏
  • 举报
回复
引用 5 楼 byxxw 的回复:
现在的问题是:SqlTransaction ts = con.BeginTransaction(); 这个已声明的tx没有用到,而你的tb.xxx的方法里又没有事务处理,所以会有问题 1.修改tb这个对象,让其操作的时候支持事务 2.用你之前声明的cmd对象处理sql,抛弃tb的调用.
把sql语句写到aspx.cs 里面来,对吗?
byxxw 2013-07-12
  • 打赏
  • 举报
回复
现在的问题是:SqlTransaction ts = con.BeginTransaction(); 这个已声明的tx没有用到,而你的tb.xxx的方法里又没有事务处理,所以会有问题 1.修改tb这个对象,让其操作的时候支持事务 2.用你之前声明的cmd对象处理sql,抛弃tb的调用.
heli_1005 2013-07-12
  • 打赏
  • 举报
回复
引用 3 楼 byxxw 的回复:
SqlCommand cmd = new SqlCommand(); cmd.Connection = con; cmd.Transaction = ts; 你的transaction是关联到cmd上的,怎么没看cmd的调用,你是用的tb这个变量的调用,也不知道tb.xxx的方法里有没有事务处理
tb.xxx方法里面没用事务处理,因为这两个表的添加,是class表增加一条,classDetail增加多条。 就是这个地方,不知道怎么用事务呢

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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