Клиент 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# могут отображаться на разные OracleDbType
s; хороший ответ показан в ответе на этот вопрос.
Оказывается нет OracleDbType.UInt64
правда не могу объяснить почему. Во всяком случае, моя проблема может быть решена путем преобразования аргумента в decimal
введите перед вставкой:
command.Parameters.Add("SampleColumn", (decimal)(valueToInsert));
Это позволяет ему стать OracleDbType.Decimal
, который любой ulong
число конвертируется в.