Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DbTransaction尝试PrepareCommand,但找不到DbConnection_C#_.net_Asp.net_Sql Server 2008_.net 4.0 - Fatal编程技术网

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}的快捷方式。