XSD事务处理
纠结,本来好好的程序突然不能运行,卡在XSD事务处理当中,代码如下。this.taActBidding.Connection.Open();
System.Data.SqlClient.SqlTransaction trans = this.taActBidding.Connection.BeginTransaction();
this.taActBidding.Adapter.InsertCommand.Transaction = trans;
this.taBiddingSct.Adapter.InsertCommand.Transaction = trans;
try
{
this.taActBidding.Update(dtActBidding);
this.taBiddingSct.Update(dtBiddingSct);
trans.Commit();
dtBiddingSct.EndInit();
MessageBox.Show("添加成功!");
}
catch (Exception exc)
{
trans.Rollback();
MessageBox.Show(exc.Message);
}
finally
{
if (this.taActBidding.Connection.State == ConnectionState.Open)
this.taActBidding.Connection.Close();
}
之前能正常运行,后来被我折腾了下Settings.settings和XSD,运行时既然提示“事务不是与当前连接无关联,就是已完成。”,烦哪位帮我看一下代码是否正确或描述一下解决方案。 --------------------编程问答-------------------- Settings.settings是否修改了连接字符串? --------------------编程问答-------------------- 有修改,不过数据读取都正常。 --------------------编程问答-------------------- 楼主是对xsd强类型的DataSet进行操作? --------------------编程问答-------------------- this.taActBidding.Update(dtActBidding);
运行这句正常,但运行this.taBiddingSct.Update(dtBiddingSct);出错 --------------------编程问答--------------------
是的,对多个表添加了数据,所以用了事务。代码如下:
DateTime dt = DateTime.Now;
DSAll.AccountDataTable dtAct = new DSAll.AccountDataTable();
DSAll.Account_BiddingDataTable dtActBidding = new DSAll.Account_BiddingDataTable();
DSAll.Bidding_SectionDataTable dtBiddingSct = new DSAll.Bidding_SectionDataTable();
//添加会节信息
DataRow drSct = dtBiddingSct.NewRow();
drSct[dtBiddingSct.IDColumn] = Guid.NewGuid().ToString();
drSct[dtBiddingSct.BSOrderColumn] = this.Order;
drSct[dtBiddingSct.SticksColumn] = this.Sticks;
drSct[dtBiddingSct.BiddingTotalColumn] = this.iBiddingTotal;
drSct[dtBiddingSct.BiddingRealTotalColumn] = this.iBiddingTotal;
drSct[dtBiddingSct.StartColumn] = this.dtpFrom.Value.ToShortDateString();
drSct[dtBiddingSct.EndColumn] = this.dtpTo.Value.ToShortDateString();
drSct.EndEdit();
dtBiddingSct.Rows.Add(drSct);
//添加会员会节信息
DataRowCollection drc = this.taAccount.GetData().Rows;
foreach (DataRow dr in drc)
{
DataRow drActBidding = dtActBidding.NewRow();
drActBidding[dtActBidding.IDColumn] = Guid.NewGuid().ToString();
drActBidding[dtActBidding.BSOrderColumn] = this.Order;
drActBidding[dtActBidding.AccountIDColumn] = dr[dtAct.IDColumn.ToString()];
drActBidding[dtActBidding.AccountNameColumn] = dr[dtAct.AccountNameColumn.ToString()];
drActBidding[dtActBidding.BiddingCountColumn] = 0;
drActBidding[dtActBidding.BiddingRealCountColumn] = 0;
drActBidding[dtActBidding.CreateDateColumn] = dt.ToShortDateString();
drActBidding[dtActBidding.ModifyDateColumn] = dt.ToShortDateString();
drActBidding.EndEdit();
dtActBidding.Rows.Add(drActBidding);
} --------------------编程问答-------------------- 对xsd强类型的DataSet要进行事务处理和传统两样哦!
要创建一个对应某个xsd中的Adapter的partial类用于事务处理!
这个说来话长!!
--------------------编程问答-------------------- LS说的PARTIAL ADAPTER类,我看过,但因时间关系也没去研究,采用我现在这种方法去做,本来是正常的,后来不知怎么回事就不行了。 --------------------编程问答-------------------- 问题解决,少了句this.taActBidding.Connection = this.taBiddingSct.Connection --------------------编程问答--------------------
你这种方式也能处理xsd的事务?这倒没研究过!!
有点怀疑,如果不出错是否真的进行了事务处理?
从道理上来说你的
this.taActBidding.Update(dtActBidding);
this.taBiddingSct.Update(dtBiddingSct);
就是两个连接,但事务处理是在一个连接中进行处理的! --------------------编程问答--------------------
呵呵,你可以试一下,我测试过,只要不执行commit数据是不会被写入数据库的。 --------------------编程问答-------------------- 我的假设:
XSD每个TA对象都有独立的连接对象。TA中的Update方法调用的连接是自身的CONNECTION,在前面经过赋值后其实就是同一个CONNECTION。至此两个UPDATE调用的是同一个CONNECTION,并用的是同一个CONNECTION生成的TRANSLATE对象。 --------------------编程问答-------------------- 受教了!
有空验证一下楼主的方法!!
补充:.NET技术 , C#