Объект транзакции не связан с объектом подключения — OracleClient

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

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

Имейте в виду - я публикую код, извлеченный из моего источника:

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

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

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


person Ali Haider    schedule 21.01.2014    source источник


Ответы (1)


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

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

Ваше здоровье -

person simon at rcl    schedule 21.01.2014
comment
Вау - это возможно! Позвольте мне проверить, и я вернусь к вам. - person Ali Haider; 22.01.2014
comment
Спасибо за ответ, он очень помог понять проблему, с которой мы столкнулись со сторонним программным обеспечением. - person boutta; 18.05.2016