2014-01-21 3 views
1

У меня возникла эта проблема повторения с одним из веб-сервисов, над которыми я работаю. Я использую транзакции и пакетное обновление с использованием адаптеров данных. Кроме того, я также использую Oracle Command Builder для получения команд вставки/удаления/обновления, которые я назначаю в dataadapter.Объект транзакции не связан с объектом соединения - OracleClient

Вот некоторые извлеченные коды из моей службы; и с линией ошибки:

Ум это - я отправляю код, извлеченный из моего источника:

OracleTransaction trx = null; 
if ((Transaction.Current.TransactionInformation.DistributedIdentifier == Guid.Empty)) 
       { 
        con.ConnectionString = con.ConnectionString + ";enlist=false"; ; 
        con.Open(); 
        trx = con.BeginTransaction(); 
        cmd.Transaction = trx; 
       } 

       try 
       { 
        dsEmpData.AcceptChanges(); 
        for (int i = 0; i < dsEmpData.Tables[0].Rows.Count; i++) 
        { 
         dsEmpData.Tables[0].Rows[i].SetAdded(); 
        } 
        OracleCommandBuilder cb = new OracleCommandBuilder(); 
        string SQL 
          = "--MY SELECT COMMAND. REMOVED BECAUSE IT IS NOT NECESSARY IN THIS BLOCK"; 

        OracleDataAdapter da = new OracleDataAdapter(SQL, ConnectionString); 
        OracleCommandBuilder cmdInsert = new OracleCommandBuilder(da); 
        dsEmpData.Tables[0].TableName = "TABLENAME".ToUpper(); 

        if ((Transaction.Current.TransactionInformation.DistributedIdentifier == Guid.Empty)) 
        { 
         da.SelectCommand.Transaction = trx; 
         da.InsertCommand = cmdInsert.GetInsertCommand();//ERROR LINE 
         da.InsertCommand.Transaction = trx; 
        } 
        da.Update(dsEmpData, "TABLENAME".ToUpper()); 
        if (trx != null) 
        { trx.Commit(); } 
       } 
       catch (Exception ex) 
       { 
        if (trx != null) 
        { trx.Rollback(); } 
        throw new FaultException("MY MESSAGE " + ex.Message); 
       } 

Так что, как было сказано выше - я получаю исключение «Объект сделка не связана с соединением объект "на указанной выше строке: da.InsertCommand = cmdInsert.GetInsertCommand();

Любая помощь по этому вопросу будет высоко оценена. Если вам нужна дополнительная информация, любезно сообщите мне.

Заранее спасибо.

ответ

2

Это связано с тем, что транзакция относится к соединению, называемому con, созданного в строке 5 вашего кода. Однако OracleDataAdaptor не связан с этим соединением. Вы даете ему строку соединения, а не соединение. Это означает, что он создаст свое собственное соединение.

Затем вы передаете этому адаптеру транзакцию, связанную с предыдущим подключением. Это не сработает! Вы должны связать адаптер данных с тем же соединением, что и транзакция. Вы можете связать адаптер с исходным соединением или создать транзакцию из подключения адаптера; тот или другой будет работать.

Cheers -

+0

Woah - Возможно, это будет возможно! Позвольте мне проверить, и я вернусь к вам. –

+0

Bravo! Это сделал трюк. Огромное спасибо! Cheers –

+0

Thx для ответа помогло значительно понять проблему, с которой мы имеем дело с сторонним программным обеспечением. – boutta