Как использовать DataTable (или аналогичный) с Oracle DB - PullRequest
0 голосов
/ 05 июня 2018

Недавно я столкнулся с некоторыми проблемами с производительностью и пытаюсь выяснить, как экспоненциально повысить производительность некоторых вызовов в БД Oracle.

Технологии:

  • .NET Core 2
  • Oracle DB
  • Dapper (необязательно)
  • Devart (необязательно)
  • OracleManaged (необязательно, бета)

Я знаком с использованием DataTable и табличных параметров для Dapper и SQL Server и хочу повторить это с помощью технологий, описанных выше.Я еще не смог воспроизвести приведенное ниже решение для работы с Devart или OracleManaged:

Код ниже не тот, что я использую ... Это перефразированный пример.Мне просто нужно что-то, что работает с Oracle для передачи DataTable или массива объектов для использования в запросе / вставке.

SQL Server:

CREATE TYPE MyCustomerInfo AS TABLE
(
    Id BIGINT NOT NULL,
    --Name NVARCHAR(32) NOT NULL,
    --...
);

C # для SQL Server:

const string getCustomersSql = @"
    SELECT
        c.Id,
        --c.Name
        --...
    FROM @myCustomers mc
    LEFT JOIN Customers c
        ON c.Id = mc.Id";

var myCustomers = new DataTable();
myCustomers.Columns.Add("Id", typeof(long));
//...

myCustomers.Rows.Add(1);
myCustomers.Rows.Add(2);

var customers = await sqlDbConnection.QueryAsync<Customer>(getCustomersSql, new { myCustomers = myCustomers.AsTableValuedParameter("MyCustomerInfo") });

БД Oracle (PL / SQL):

CREATE TYPE MY_CUSTOMER_INFO AS OBJECT
(
    ID BIGINT,
    --NAME VARCHAR2(32),
    --...
);

CREATE TYPE MY_CUSTOMER_INFO_ARRAY AS TABLE OF MY_CUSTOMER_INFO;

C # для БД Oracle:

Я сделал аналогичный подход, какс SQL Server, но с Devart и OracleManaged, и ни один не работал.Я также [очень-к несчастью] попытался использовать OracleCommand и OracleParameter напрямую - снова с Devart и OracleManaged - безрезультатно.

Мои результаты с Devart, похоже, указывают на то, что функциональность намеренно заблокирована.Мои результаты с OracleManaged, похоже, указывают на то, что он еще не был реализован, что неудивительно, поскольку это бета-версия (предположительно выпущенная в третьем году в этом году).

Мой следующий подход может заключаться в использовании связанных массивов (в которыхУ меня очень мало опыта или желания учиться) с Девартом.На данный момент я просто исследую что-то, что будет работать с аналогичным приростом производительности ...

EDIT : использование подхода с массивом на параметр возможно, но ужасно неудобно при большом размереклассы заканчиваются с 12+ массивами.Я бы хотел альтернативу этому подходу.

...