当前位置:编程学习 > C#/ASP.NET >>

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);出错 --------------------编程问答--------------------
引用 3 楼 koukoujiayi 的回复:
楼主是对xsd强类型的DataSet进行操作?

是的,对多个表添加了数据,所以用了事务。代码如下:
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 --------------------编程问答--------------------
引用 7 楼 jardyson 的回复:
LS说的PARTIAL ADAPTER类,我看过,但因时间关系也没去研究,采用我现在这种方法去做,本来是正常的,后来不知怎么回事就不行了。

你这种方式也能处理xsd的事务?这倒没研究过!!
有点怀疑,如果不出错是否真的进行了事务处理?
从道理上来说你的
  this.taActBidding.Update(dtActBidding);
  this.taBiddingSct.Update(dtBiddingSct);
就是两个连接,但事务处理是在一个连接中进行处理的! --------------------编程问答--------------------
引用 9 楼 koukoujiayi 的回复:
引用 7 楼 jardyson 的回复:
LS说的PARTIAL ADAPTER类,我看过,但因时间关系也没去研究,采用我现在这种方法去做,本来是正常的,后来不知怎么回事就不行了。

你这种方式也能处理xsd的事务?这倒没研究过!!
有点怀疑,如果不出错是否真的进行了事务处理?
从道理上来说你的
  this.taActBidding.Update(dtActBidding);
  ……

呵呵,你可以试一下,我测试过,只要不执行commit数据是不会被写入数据库的。 --------------------编程问答-------------------- 我的假设:
XSD每个TA对象都有独立的连接对象。TA中的Update方法调用的连接是自身的CONNECTION,在前面经过赋值后其实就是同一个CONNECTION。至此两个UPDATE调用的是同一个CONNECTION,并用的是同一个CONNECTION生成的TRANSLATE对象。 --------------------编程问答-------------------- 受教了!
有空验证一下楼主的方法!!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,