Совместное использование ManagedDataAccess.Client.OracleConnection соединения / сеанса / транзакции с DataAccess.Client.OracleConnection - PullRequest
2 голосов
/ 17 апреля 2020

В моем приложении я использую класс Repository со свойством public Oracle.ManagedDataAccess.Client.OracleConnection DbConn. В другом классе, где я использую этот репозиторий, есть особый случай, когда мне нужно использовать OracleBulkCopy, чтобы быстро импортировать данные из файла Access, который, к сожалению, до сих пор не поддерживается управляемым nuget Oracle. Поэтому мне нужно создать экземпляр Oracle.DataAccess.Client.OracleConnection и создать OracleBulkCopy на основе этого соединения. Но я хотел бы сохранить весь процесс внутри транзакции, как изменения, сделанные через подключение к репозиторию, так и «неуправляемый» OracleConnection. Единственный способ убедиться в том, что это сделано, - «поделиться» базовым соединением / сеансом / транзакцией в Oracle.ManagedDataAccess.Client.OracleConnection хранилища с Oracle.DataAccess.Client.OracleConnection. Возможно ли такое?

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

1 Ответ

0 голосов
/ 17 апреля 2020

Если у вас есть хранилище со свойством

Oracle.ManagedDataAccess.Client.OracleConnection DbConn

Вы можете абстрагировать это с помощью базового класса

System.Data.Common.DbConnection DbConn

Теперь, основываясь на нужной вам функции, вы можете передать либо Oracle.ManagedDataAccess.Client.OracleConnection или Oracle.DataAccess.Client.OracleConnection.

Большинство функций будут работать с обеими версиями, но BulkCopy будет работать только с неуправляемыми. Так что в вашем коде просто сделайте

if (DbConn is Oracle.DataAccess.Client.OracleConnection conn)
{
  //. . . . Do your bulk copy
} 
else
    throw new InvalidOperationException("Bulk copy supported only by un-managed ODP");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...