//-----------事务类--------------------------------------------------------------------------------
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
如果看不懂 可以加我 远程 也给分 谢谢了
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
如果看不懂 可以加我 远程 也给分 谢谢了
#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
public SqlTransaction OpenTrans()
{
using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectString))
{
conn.Open();
using (SqlTransaction tran = conn.BeginTransaction())
{ return tran;}
}
}你用了using,出了作用域就回收了。后面调用OpenTrans()获取SqlTransaction ,再使用就报错了。
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;}
}
}
}
该如何 写啊?
using (SqlTransaction tran = conn.BeginTransaction())这样肯定不行
先去看看using是什么意思吧你可以在BaseBll中定义一个全局的变量Open的时候判断是否为null,为null就new一个
然后有个Close方法
在这个方法里面释放