【发布时间】:2017-03-10 11:34:20
【问题描述】:
代码:
我正在尝试运行此函数,但它会引发错误: 此 SqlTransaction 已完成;它不再可用。
我用过所有其他方式,但没有工作。我在没有USING 的情况下使用它,但仍然出现同样的错误。
为什么?
public Boolean AddWorkProgress(int WorkID, int ContractorID, float PhysicalProgress,
decimal FinancialProgress, int UserID, int OrgID, float FinancialProgressPecentage)
{
SqlCommand SqlCom = new SqlCommand("AddWorkProgress", DataBaseConnection.OpenConnection());
SqlCom.CommandType = CommandType.StoredProcedure;
using (SqlTransaction sqlTrans = SqlCom.Connection.BeginTransaction())
{
SqlCom.Transaction = sqlTrans;
try
{
SqlCom.Parameters.AddWithValue("@Work_ID", WorkID);
SqlCom.Parameters.AddWithValue("@Contractor_ID", ContractorID);
SqlCom.Parameters.AddWithValue("@PhysicalProgress", PhysicalProgress);
SqlCom.Parameters.AddWithValue("@FinancialProgress", FinancialProgress);
SqlCom.Parameters.AddWithValue("@OrgID", OrgID);
SqlCom.Parameters.AddWithValue("@fk_WebUsers_UserID", UserID);
SqlCom.Parameters.AddWithValue("@FinancialProgressPercentage", FinancialProgressPecentage);
SqlParameter SqlParamReturnStatus = new SqlParameter("@ReturnStatus", SqlDbType.Bit);
SqlCom.Parameters.Add(SqlParamReturnStatus);
SqlParamReturnStatus.Direction = ParameterDirection.Output;
SqlParameter SqlParamReturnStatusMessage = new SqlParameter("@ReturnStatusMessage", SqlDbType.VarChar, -1);
SqlCom.Parameters.Add(SqlParamReturnStatusMessage);
SqlParamReturnStatusMessage.Direction = ParameterDirection.Output;
SqlCom.ExecuteNonQuery();
DataBaseConnection.CloseConnection();
string ReturnStatusMessage = Convert.ToString(SqlParamReturnStatusMessage);
Boolean ReturnStatus = Convert.ToBoolean(SqlParamReturnStatus.Value);
// ProgressID = Convert.ToInt64(SqlParamReturnProgressID.Value);
sqlTrans.Commit();
return ReturnStatus;
}
catch (Exception ex)
{
sqlTrans.Rollback();
sqlTrans.Dispose();
throw ex;
}
}
}
【问题讨论】:
-
在我看来你在提交事务之前关闭了连接
-
您可能也应该将您的连接放在
using块中。 -
catch 块也是多余的。
using块将回滚并处理事务。 -
你为什么要使用事务?你只执行一个程序
-
另外,连接也应该放在
using语句中。现在,任何错误都会使连接保持打开状态
标签: c# asp.net .net c#-4.0 ado.net