Получение идентификаторов из запроса Oracle с использованием ядра .net и Oracle.ManagedDataAccess.Core - PullRequest
0 голосов
/ 29 октября 2018

У меня есть следующий код:

List<foo> collection = getData();
using (OracleConnection conn = _client.GetConnection())
{
    await conn.OpenAsync();
    using (OracleTransaction transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted))
    using (OracleCommand cmd = new OracleCommand())
    {
        cmd.Transaction = transaction;
        cmd.Connection = conn;
        cmd.CommandText = @"INSERT INTO SOME.TABLE
                           (A, B, C)
                           VALUES
                           (:A, :B, :C)";
        cmd.ArrayBindCount = collection.Count;
        cmd.Parameters.Add(":A", OracleDbType.Varchar2, collection.Select(c => c.A).ToArray(), ParameterDirection.Input);
        cmd.Parameters.Add(":B", OracleDbType.Varchar2, collection.Select(c => c.B).ToArray(), ParameterDirection.Input);
        cmd.Parameters.Add(":C", OracleDbType.Varchar2, collection.Select(c => c.C).ToArray(), ParameterDirection.Input);

        try
        {
            await cmd.ExecuteNonQueryAsync();
            transaction.Commit();
        }
        catch (Exception ex)
        {
            transaction.Rollback();
            throw new FailedTransactionException(ex.ToString());
        }
    }
}

Здесь я могу вставить несколько строк данных из моей коллекции, но мне нужно как-то вернуть идентификаторы вставленных строк. Может ли кто-нибудь указать мне правильное направление или если есть лучший подход для вставки массива объектов и получения идентификаторов обратно.

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете получить сгенерированный идентификатор, выполнив это:

@"INSERT INTO SOME.TABLE
  (A, B, C)
  VALUES
  (:A, :B, :C) 
  RETURNING <YOUR-ID-FIELD> INTO :resultId";

И объявить параметр результата следующим образом:

var resultParam = new OracleParameter(":resultId", OracleDbType.Decimal /* or whatever type of your identifier has */);
resultParam.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(resultParam);

Затем вы можете прочитать результат из параметра после выполнения запроса из его свойства Value:

var result = resultParam.Value
...