首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

事宜执行不正确

2013-07-16 
事务执行不正确以下是aspx.cs中的代码。是主从关系的表的添加功能,一个主表,多个从表。所以我把事务用在aspx

事务执行不正确
以下是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();
                }
            }


老弟,你该回去看下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都成功时,则回滚已成功的操作

热点排行