Мы используем 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 правильное, то поведение управляемого соединения неправильное?