Клиент Oracle генерирует ArgumentException с параметром ulong

Мне нужно вставить ulong (То есть, UInt64) в базу данных Oracle, но я сталкиваюсь с ArgumentException, Я вставляю это в NUMBER колонка, в которой я себя уверял, должна уметь хранить любое число от 0 до 2^64-1.

Вот минимальный пример, который будет воспроизводить ошибку:

// First create the following table:
//
//     CREATE TABLE SampleTable (SampleColumn NUMBER)
//
using (var dbConnection = new OracleConnection("..."))
{
    ulong valueToInsert = 123;

    OracleCommand command = dbConnection.CreateCommand();
    command.CommandText = @"INSERT INTO SampleTable (SampleColumn) VALUES (:SampleColumn)";
    command.Parameters.Add("SampleColumn", valueToInsert);

    command.ExecuteNonQuery();
}

Этот код работает просто отлично, если valueToInsert имеет любой другой целочисленный тип (включая long), но когда я попробую это с ulongЯ получаю следующую ошибку:

System.ArgumentException was unhandled by user code
  HResult=-2147024809
  Message=Value does not fall within the expected range.
  Source=Oracle.DataAccess
  StackTrace:
     at Oracle.DataAccess.Client.OracleParameter..ctor(String parameterName, Object obj)
     at Oracle.DataAccess.Client.OracleParameterCollection.Add(String name, Object val)

Почему это происходит?

PS Я пытался использовать как Oracle.DataAccess 2.112.1.2, так и Oracle.ManagedDataAccess 4.212.1.0.

1 ответ

Решение

Разные типы C# могут отображаться на разные OracleDbTypes; хороший ответ показан в ответе на этот вопрос.

Оказывается нет OracleDbType.UInt64правда не могу объяснить почему. Во всяком случае, моя проблема может быть решена путем преобразования аргумента в decimal введите перед вставкой:

command.Parameters.Add("SampleColumn", (decimal)(valueToInsert));

Это позволяет ему стать OracleDbType.Decimal, который любой ulong число конвертируется в.

Другие вопросы по тегам