Соединение с базой данных Oracle.ManagedDataAccess неправильно клонировано - PullRequest
0 голосов
/ 19 марта 2019

Мы используем Oracle.ManagedDataAcces версию 18.3.0 в приложении C # для .Net 4.6.1.

Кажется, есть проблема, когда соединение клонируется, если транзакция уже открыта. В этом случае транзакция клонированного соединения не устанавливается на null, что быстро приводит к System.InvalidOperationException, если транзакция будет открыта.

Пример кода из приложения с графическим интерфейсом:

public partial class Form1 : Form
{
    public DbConnection LogonConnection { get; set; }
    public DbTransaction LogonTransaction { get; set; }
    public DbConnection FormConnection { get; set; }
    public DbTransaction FormTransaction { get; set; }

public Form1()
{
    InitializeComponent();
    LogonConnection = NewManagedConnection(); // Creates a new Oracle.ManagedDataAccess.Client.OracleConnection
    LogonConnection.Open();
    LogonTransaction = LogonConnection.BeginTransaction();

    // ... do the login ...

}

private void OpenForm_Click(object sender, EventArgs e)
{
    FormConnection = CloneManagedConnection(LogonConnection); // Clones the given connection.
    FormConnection.Open();
    FormTransaction = FormConnection.BeginTransaction(); // EXCEPTION
}

Метод OpenForm_Click(..) приводит к описанному исключению.

Состояние документов Oracle:

Клонированный объект имеет те же значения свойств, что и клонируемый объект.

Для меня неясно, намеревался ли Oracle игнорировать существующую транзакцию и, таким образом, клонировать ее (что делает соединение де-факто непригодным для использования), или это ошибка. Что ты думаешь?

Мы недавно мигрировали из Oracle ODP (Oracle.DataAccess) в управляемое соединение. В случае соединений ODP исключение не воспроизводится, и клонирование соединения работает, как ожидается. Итак, если поведение соединения ODP правильное, то поведение управляемого соединения неправильное?

...