dal:        public IDbTransaction BeginTransaction()
        {
            return SqlHelper.CreateConnection().BeginTransaction();
        }        public void Insert(IDbTransaction trans, UserInfo user)
        {
            SqlParameter[] cmdParms = this.GetParameters(user);
            string cmdText = @"insert into [Users] (" + FIELDS_NONID + ") values(" + PARMS + "); select @@identity;";
            Object val = SqlHelper.ExecuteScalar(trans as SqlTransaction, CommandType.Text, cmdText, cmdParms);
            user.UserId = Convert.ToInt32(val);
        }bll:        public void Insert(UserInfo user)
        {
            using (var trans = dao.BeginTransaction())
            {
                try
                {
                    dao.Insert(trans, user);
                    dao.Insert(trans, user);
                    dao.Insert(trans, user);
                    trans.Commit();
                }
                catch
                {
                    trans.Rollback();
                    throw;
                }
            }
        }
捕获到异常的时候是否应该显式地关掉连接呢。

解决方案 »

  1.   


    还想请教一下,using (var trans = dao.BeginTransaction()) 用了这样的using结构,没抛出异常的情况,
    与它关联的Connection会不会关闭,还是只是释放了Transaction?
      

  2.   

    using (){}作用是代码块执行结束后会自动调用using后面括号里面类型的dispose方法,Transaction里面的dispose方法应该不会关闭与之关联的Connection的
      

  3.   

    试了下,如果在finally里用trans.Connection.Close() 会抛出null引用异常。
    最后改写成这样,不知道有没有更简洁的办法..        public void Insert(UserInfo user)
            {
                using (var trans = dao.BeginTransaction())
                {
                    using (var conn = trans.Connection)
                    {
                        try
                        {
                            dao.Insert(trans, user);
                            dao.Insert(trans, user);
                            dao.Insert(trans, user);
                           // trans.Rollback();
                            trans.Commit();
                        }
                        catch
                        {
                            trans.Rollback();
                            throw;
                        }
                        finally
                        {
                            conn.Close();
                        }
                    }
                }
            }
      

  4.   


    using (var trans = dao.BeginTransaction())
                {
                        try
                        {
                            dao.Insert(trans, user);
                            dao.Insert(trans, user);
                            dao.Insert(trans, user);
                           // trans.Rollback();
                            trans.Commit();
                        }
                        catch
                        {
                            trans.Rollback();
                            throw;
                        }
                        finally
                        {
                            if(!trans.Connection.IsClose())
                               trans.Connection.Close();
                        }
                }
      

  5.   

    这样也不对啊,试了几种情况, 在finally里Connection始终为null;
                    finally
                    {
                        if (trans != null)
                        {
                            if (trans.Connection != null)
                            {
                                if (trans.Connection.State != System.Data.ConnectionState.Closed)
                                {
                                    trans.Connection.Close();
                                }
                                else
                                {
                                    Console.WriteLine("Connection is Closed");    
                                }
                            }
                            else
                            {
                                Console.WriteLine("Connection is Disposed");
                            }
                        }
                        else
                        {
                            Console.WriteLine("Transaction is Disposed");
                        }
                    }
      

  6.   

    如果Connection调用了Dispose,那连接应该是会被关闭的吧
      

  7.   

    using(TransactionScope scope = new TransactionScope())
    {
    //方法1   
    //方法2:   
    scope.Complete();
    }  
      

  8.   


    谢谢,如果用了TransactionScope,是否还需要使用Connection.BeginTransaction呢,能否结合主题的代码给个稍微详细点例子..