62,256
社区成员
发帖
与我相关
我的任务
分享
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都成功时,则回滚已成功的操作