当我在我的代码中执行特定功能时,我收到以下错误,该代码运行大量其他数据库调用事务。
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中消失的错误。
但它仍在发生。传递时,连接参数正在消失。当在该特定函数中发生第一次数据库调用时,以及在提交事务之前发生错误。
请帮忙。
答案 0 :(得分:1)
在entlib中,您不应该创建连接。 试试这个:
_db = DatabaseFactory.CreateDatabase();
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
_command = _db.GetStoredProcCommand(storedProcedure);
DataSet ds = _db.ExecuteDataSet(_command);
ts.Complete();
}