C# DbTransaction尝试PrepareCommand,但找不到DbConnection
当我在代码中执行一个特定的函数,该函数使用事务运行大量其他数据库调用时,我收到了以下错误C# DbTransaction尝试PrepareCommand,但找不到DbConnection,c#,.net,asp.net,sql-server-2008,.net-4.0,C#,.net,Asp.net,Sql Server 2008,.net 4.0,当我在代码中执行一个特定的函数,该函数使用事务运行大量其他数据库调用时,我收到了以下错误 System.ArgumentNullException: Value cannot be null. Parameter name: connection at Microsoft.Practices.EnterpriseLibrary.Data.Database.PrepareCommand(DbCommand command, DbConnection connection) at Microsoft
System.ArgumentNullException: Value cannot be null.
Parameter name: connection
at Microsoft.Practices.EnterpriseLibrary.Data.Database.PrepareCommand(DbCommand command, DbConnection connection)
at Microsoft.Practices.EnterpriseLibrary.Data.Database.PrepareCommand(DbCommand command, DbTransaction transaction)
at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery(DbCommand command, DbTransaction transaction)
at net.cadat.dataManager.dbConn.DataAccess.execute(String storedProcedure, StoredProcedureParameter[] sqlParameters)
虽然很难发布我的全部源代码,但数据库调用的流程基本上如下所示:
_db = DatabaseFactory.CreateDatabase();
_conn = _db.CreateConnection();
_conn.Open();
if (_transaction == null)
_transaction = _conn.BeginTransaction();
// later in code
_command = _db.GetStoredProcCommand(storedProcedure);
DataSet ds = null;
if (_transaction == null)
ds = _db.ExecuteDataSet(_command);
else
ds = _db.ExecuteDataSet(_command, _transaction);
显然,上面的代码跨越了databasefactory类的不同函数。我称之为“DA”类。所以DA类在每个函数中按值传递,似乎当DA传递时,事务或连接正在消失
最近我确定构建是针对.NET4.0Framework的,因为在2.0之前,我意识到2.0有一个关于连接参数随GC消失的bug
但这种情况仍在发生。传递连接参数时,该参数将消失。该错误发生在该特定函数中的第一个数据库调用发生时,以及在提交事务之前
System.ArgumentNullException: Value cannot be null.
Parameter name: connection
at Microsoft.Practices.EnterpriseLibrary.Data.Database.PrepareCommand(DbCommand command, DbConnection connection)
at Microsoft.Practices.EnterpriseLibrary.Data.Database.PrepareCommand(DbCommand command, DbTransaction transaction)
at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery(DbCommand command, DbTransaction transaction)
at net.cadat.dataManager.dbConn.DataAccess.execute(String storedProcedure, StoredProcedureParameter[] sqlParameters)
请帮助。在entlib中,您不应该创建连接。 试试这个:
_db = DatabaseFactory.CreateDatabase();
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
_command = _db.GetStoredProcCommand(storedProcedure);
DataSet ds = _db.ExecuteDataSet(_command);
ts.Complete();
}
你说它到处传播是什么意思?当您作为参数传递给另一个方法时?您的“
DA
”也是局部变量还是类级变量?它是局部变量。我将DA传递给其他子函数。不知何故,因为我使用事务,传递它,导致了问题。如果我禁用事务,一切正常。它也通过值传递。这不是我在C++中所做的事情,但是我真的很困惑C如何允许这个(并且以前的代码也这样做)。为什么不是BTW(好奇,是因为EnLIB已经管理了,那么当我做什么时呢?)你能解释一下为什么使用“using(”,using做了什么,仅仅排除它是不行的?我的意思是,我知道它是一个IDisposable,但是在代码的末尾,我确实有一个finally{dispose}用于连接和事务if not null。嗯,现在我删除了大量if(connection==null)createconnection();键入stuff,代码似乎工作得更好,这是为什么?在此之前代码工作得如何?我不知道手动创建连接时内部会发生什么。我只知道您不应该这样做(特殊情况除外)。using语句只是try finally{dispose}的快捷方式。