DbTransaction пытается выполнить PrepareCommand и не может найти DbConnection - PullRequest
0 голосов
/ 19 августа 2011

Я получаю следующую ошибку, когда в своем коде я использую определенную функцию, которая выполняет тонну других вызовов базы данных с транзакцией.

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);

Очевидно, что приведенный выше код охватывает различные функции класса базы данных. Я называю это "класс DA". Таким образом, класс DA передается в каждом значении BY функции, и кажется, что когда DA передается, транзакции или соединения исчезают?!?!

Недавно я убедился, что сборка предназначена для платформы .Net 4.0, потому что раньше она была 2.0, и я понял, что в 2.0 есть ошибка, связанная с исчезновением параметра соединения в GC.

все же это все еще происходит. Параметр соединения исчезает при его передаче. Ошибка происходит, когда первый вызов базы данных происходит в этой конкретной функции и перед фиксацией транзакции.

Пожалуйста, помогите.

1 Ответ

1 голос
/ 20 августа 2011

В entlib вы не должны создавать соединение.Попробуйте это:

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

    ts.Complete();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...