2

我需要在Oracle 数据库中插入一个ulong(即)数字,但我正在运行一个. 我将它插入一列,我向自己保证应该能够存储从 0 到 2^64-1 的任何数字。 UInt64ArgumentExceptionNUMBER

这是一个将重现错误的最小示例:

// 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。

4

1 回答 1

4

允许不同的C#类型映射到不同OracleDbType的s;这个问题的答案中显示了一个很好的列表。

事实证明没有OracleDbType.UInt64,但我无法解释原因。无论如何,我的问题可以通过decimal在插入之前将参数转换为类型来解决:

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

这允许它变成OracleDbType.Decimal,任何ulong数字都可以转换成。

于 2014-01-28T02:57:55.227 回答