DbTransaction尝试PrepareCommand并且找不到DbConnection

时间:2011-08-19 18:46:34

标签: 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.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类在每个函数BY值中传递,看起来当DA传递时,事务或连接正在消失?!?!

最近我确定构建是针对.Net 4.0框架的,因为在2.0之前,我意识到2.0有关于连接参数在GC中消失的错误。

但它仍在发生。传递时,连接参数正在消失。当在该特定函数中发生第一次数据库调用时,以及在提交事务之前发生错误。

请帮忙。

1 个答案:

答案 0 :(得分:1)

在entlib中,您不应该创建连接。 试试这个:

_db = DatabaseFactory.CreateDatabase();
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    _command = _db.GetStoredProcCommand(storedProcedure);
    DataSet ds = _db.ExecuteDataSet(_command);

    ts.Complete();
}