C# 谁能说出什么';我的交易有错
您好,我已经编写了以下事务来插入数据,但是当我得到一个异常时,只有得到该异常的数据没有插入到数据库,其余的都在插入 这是我写的C# 谁能说出什么';我的交易有错,c#,asp.net,sqltransaction,C#,Asp.net,Sqltransaction,您好,我已经编写了以下事务来插入数据,但是当我得到一个异常时,只有得到该异常的数据没有插入到数据库,其余的都在插入 这是我写的 public bool addWhole(SqlTransaction osqlTrans) { m_flag = false; osqlTrans = null; SqlConnection osqlCon = new SqlConnection(constr); if (osqlCon.State != ConnectionState
public bool addWhole(SqlTransaction osqlTrans)
{
m_flag = false;
osqlTrans = null;
SqlConnection osqlCon = new SqlConnection(constr);
if (osqlCon.State != ConnectionState.Open)
{
osqlCon.Open();
}
osqlTrans = osqlCon.BeginTransaction();
try
{
if (this.addRisk(osqlTrans, osqlCon))
{
if (this.addEconomical(osqlTrans, osqlCon))
{
osqlTrans.Commit();
}
}
}
catch (Exception ex)
{
osqlTrans.Rollback();
}
finally
{
osqlCon.Close();
}
return m_flag;
}
public bool addRisk(SqlTransaction oRiskTrans, SqlConnection oRiskConn)
{
con = new SqlConnection(constr);
if (con.State != ConnectionState.Open)
{
con.Open();
}
cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('" + id + "','" + str + "','" + dbPercent + "')", con); //Even i tried adding transaction in command statement
if (cmd.ExecuteNonQuery() > 0)
{
m_flag = true;
}
}
public bool addEconomical(SqlTransaction oRiskTrans, SqlConnection oRiskConn)
{
con = new SqlConnection(constr);
if (con.State != ConnectionState.Open)
{
con.Open();
}
cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('" + id + "','" + str + "','" + dbPercent + "')", con);//Even i tried adding transaction in command statement
if (cmd.ExecuteNonQuery() > 0)
{
m_flag = true;
}
}
我试图通过第二个条件失败来回滚事务,但我的第一条语句是插入到
DB
。。我该怎么做才能克服这个问题呢?我猜这就是其中之一
1) 您没有对所有不同的命令使用相同的连接对象2) 在执行命令之前,您没有将事务分配给命令
3) 也许两者都有
在执行命令之前,请尝试使用相同的连接对象并将事务分配给该命令。有关示例,请参见MSDN上的本页 事务不在连接之间共享,您总是创建一个新连接。使用指定为方法的第二个参数的oRiskConn。因为您要在代码不起作用的每个函数中创建新连接。只需断开连接
`con = new SqlConnection(constr);`
将其替换为功能中可用的连接,即
oRiskConn
,不要将其初始化为新连接。如果您再次这样做,按照您的要求进行的交易将不起作用。在命令对象中还包括oRiskTrans
。然后它将按照您的要求工作我不知道您的一些参数是什么,但看起来您需要这样的参数:
class SomeClass
{
// These need to be set to appropriate values
int id, str;
double dbPercent;
string constr;
public bool addWhole()
{
var m_flag = false;
using (var osqlCon = new SqlConnection(constr))
{
if (osqlCon.State != ConnectionState.Open)
{
osqlCon.Open();
}
using (var osqlTrans = osqlCon.BeginTransaction())
{
try
{
if (m_flag = this.addRisk(osqlTrans))
{
if (m_flag = this.addEconomical(osqlTrans))
{
osqlTrans.Commit();
}
}
}
catch (Exception)
{
// Use $exception in watch window if you are debugging
osqlTrans.Rollback();
}
}
}
return m_flag;
}
public bool addRisk(SqlTransaction oRiskTrans)
{
var m_flag = false;
using (var cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('" + id + "','" + str + "','" + dbPercent + "')"))
{
cmd.Transaction = oRiskTrans;
cmd.Connection = oRiskTrans.Connection;
if (cmd.ExecuteNonQuery() > 0)
{
m_flag = true;
}
}
return m_flag;
}
public bool addEconomical(SqlTransaction oRiskTrans)
{
var m_flag = false;
using (var cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('" + id + "','" + str + "','" + dbPercent + "')"))
{
cmd.Transaction = oRiskTrans;
cmd.Connection = oRiskTrans.Connection;
if (cmd.ExecuteNonQuery() > 0)
{
m_flag = true;
}
}
return m_flag;
}
}
osqlTrans
的使用令人震惊!