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

C#事务的有关问题,SqlTransaction 的对象,可以夸方法传递吗

2013-09-15 
C#事务的问题,SqlTransaction的对象,可以夸方法传递吗SqlConnection con new SqlConnection(CommonERP.s

C#事务的问题,SqlTransaction 的对象,可以夸方法传递吗

   SqlConnection con = new SqlConnection(CommonERP.sqlConStr);
            //连接
            con.Open();
            //实例化事务
            SqlTransaction myst = con.BeginTransaction();
            try
            {
                //保存主表数据
                int mainResult = DAL.po_purchaseOrder.addPurchaseOrder(myst, obj);
                if (mainResult <= 0)
                {
                    myst.Rollback();
                    con.Close();
                }
                //循环保存子表数据
                for (int i = 0; i < rowAdd.Length; i++)
                {
                    //项次加1
                    string no = "0" + (maxNo += 1).ToString();
                    //构造正确项次
                    no = no.Substring(no.Length - 2);
                    //项次赋值
                    rowAdd[i]["poOrderItemNo"] = no;
                    int itemResult = DAL.po_purchaseOrder.addItem(myst, rowAdd[i], obj.PoOrderNo);


                    if (itemResult <= 0)
                    {
                        myst.Rollback();
                        con.Close();
                        return false;
                    }
                }
                //提交事务
                myst.Commit();
                //关闭连接
                con.Close();
                //返回值
                return true;
            }
            catch
            {
                myst.Rollback();
                con.Close();
                return false;
            }



我这样写事务,如果子表出错,会回滚主表的操作吗?
[解决办法]
int itemResult = DAL.po_purchaseOrder.addItem(myst, rowAdd[i], obj.PoOrderNo); 


这个应该是提交子表的数据吧?

这种方法不可取,应该一次性和主表一起提交,要么全部成功,要么全失败。


[解决办法]
只要是对象都可以到处传递。

事务不存在“部分成功”一说,要么全部,要么全不。所以不存在“主表成功,子表失败”一说。
[解决办法]
楼主对事物驱动模式看来还不是非常了解,你的操作链(主表和子表操作)都是在一个事物中提交,当然是全部成功,或者全部回滚。这还有什么疑问可发?

[解决办法]
明显可以的,
你的事物对象是指向同一个引用的

[解决办法]
楼主的写法是可以的.不过这几句是有问题的.

if (mainResult <= 0)
                {
                    myst.Rollback();
                    con.Close();
                }

if (itemResult <= 0)
                    {
                        myst.Rollback();
                        con.Close();
                        return false;
                    }
这两个判断是多余的.去掉.

因为只有事务提交后才会有返回结果.



[解决办法]
这个是可以的啊,循环还了再提交事务嘛,出错了就回滚嘛,不过你第一个回滚没有意义,因为mainResult=0,本身就没有写入数据库,第二个回滚和最后一次出错了回滚同理。

热点排行