//-----------事务类--------------------------------------------------------------------------------
   public class BaseBll
    {
        /// <summary>
        /// 开启事务
        /// </summary>
        /// <returns></returns>
        public SqlTransaction OpenTrans()
        {
            //SqlConnection con = new SqlConnection(SqlHelper.ConnectString);
            //con.Open();
            //SqlTransaction tran = con.BeginTransaction();
            //return tran;
            using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectString))
            {
                conn.Open();
                using (SqlTransaction tran = conn.BeginTransaction())
                { return tran;}
            }
        }
    }
//---------数据访问-----------------------------------------------------------------------------------        //开启事务可调用多个数据访问操作
        BaseBll bbl = new BaseBll();
        try
        {
            //SqlHelper.ExecuteNonQuery(strSql.ToString(), parameters);   
            SqlHelper.ExecuteNonQuery(bbl.OpenTrans(), CommandType.Text, strSql.ToString(), parameters);
                //SqlHelper.ExecuteNonQuery(strSqll.ToString(), parametersl);
                SqlHelper.ExecuteNonQuery(bbl.OpenTrans(), CommandType.Text, strSqll.ToString(), parametersl);
            bbl.OpenTrans().Commit();//提交事务
        }
        catch (Exception ex)
        {
            bbl.OpenTrans().Rollback();//回滚事务
            //throw ex;
        }
//------SqlHelper类---------------------------------------------------------------------------------
/// <summary>
/// 执行一个sql命令,仅仅返回数据库受影响行数。(用于需要事务的情况)
/// 所需参数:事务对象,命令类型,命令文本,参数列表。
/// </summary>
/// <param name="trans">事务对象</param>
/// <param name="cmdType">命令类型</param>
/// <param name="cmdText">命令文本</param>
/// <param name="cmdParms">参数列表</param>
/// <returns>数据库受影响行数</returns>
public static int ExecuteNonQuery(SqlTransaction trans,CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)
{
            try
            {
                SqlCommand cmd = new SqlCommand();
                PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;
            }
            catch (SqlException sqlex)
            {
                if (sqlex.Number == 547)
                    throw new Exception("外建冲突!");
                else
                    throw sqlex;
            }
            catch(Exception ex)
            {
                throw ex;
            }
}
//-------------------连接--------------
        public static string ConnectString = ConfigurationManager.AppSettings["lj"];
//----错误就在这里!!!!!!!!!!!!!----------------
/// <summary>
/// 准备一个可以执行的Sql命令对象。
/// </summary>
/// <param name="cmd">命令对象</param>
/// <param name="conn">连接对象</param>
/// <param name="trans">事务对象</param>
/// <param name="cmdType">命令类型</param>
/// <param name="cmdText">命令文本</param>
/// <param name="cmdParms">参数列表</param>
private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
{ if (conn.State != ConnectionState.Open)//到这就说  对象没实列  没有new 晕!!谢谢
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText; if (trans != null)
cmd.Transaction = trans; cmd.CommandType = cmdType; if (cmdParms != null)
{
                foreach (SqlParameter parm in cmdParms)
                {
                    if (parm.Value == null)
                    {
                        parm.Value = DBNull.Value;
                    }
                    cmd.Parameters.Add(parm);
                }
}//////////、
我没有用n层架构
问题在代码中!!!!
我QQ406050799
如果看不懂  可以加我 远程 也给分 谢谢了 

解决方案 »

  1.   

    你看下是不是连接的问题,我连接是这样写的,用事务都用的好好的.
    #region   -- 获取数据库的连接 GetOracleConnection()
            /// <summary>
            /// 获取数据库的连接
            /// </summary>
            /// <returns></returns>
            public OracleConnection GetOracleConnection()
            {
                string strCon = System.Configuration.ConfigurationManager.AppSettings["strConnect"].ToString();
                try
                {
                    OracleConnection myConn = new OracleConnection(strCon);
                    myConn.Open();
                    return myConn;
                }
                catch (Exception ex)
                {
                    string error = ex.Message;
                    return null;
                }
            }
            #endregion
      

  2.   

    错误在这里:
    public SqlTransaction OpenTrans()
            {
                using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectString))
                {
                    conn.Open();
                    using (SqlTransaction tran = conn.BeginTransaction())
                    { return tran;}
                }
            }你用了using,出了作用域就回收了。后面调用OpenTrans()获取SqlTransaction ,再使用就报错了。
      

  3.   

    //-----------事务类--------------------------------------------------------------------------------
       public class BaseBll
        {
            /// <summary>
            /// 开启事务
            /// </summary>
            /// <returns></returns>
            public SqlTransaction OpenTrans()
            {
                //SqlConnection con = new SqlConnection(SqlHelper.ConnectString);
                //con.Open();
                //SqlTransaction tran = con.BeginTransaction();
                //return tran;
                using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectString))
                {
                    conn.Open();
                    using (SqlTransaction tran = conn.BeginTransaction())
                    { return tran;}
                }
            }
        }
    该如何 写啊?
      

  4.   

    using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectString))
    using (SqlTransaction tran = conn.BeginTransaction())这样肯定不行
    先去看看using是什么意思吧你可以在BaseBll中定义一个全局的变量Open的时候判断是否为null,为null就new一个
    然后有个Close方法
    在这个方法里面释放