Oracle Client使用ulong参数抛出ArgumentException

时间:2014-01-28 02:34:43

标签: oracle oracleclient odac argumentexception ulong

我需要在Oracle数据库中插入一个ulong(即UInt64)号码,但我遇到了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)

为什么会这样?

P.S。我尝试过使用Oracle.DataAccess 2.112.1.2和Oracle.ManagedDataAccess 4.212.1.0。

1 个答案:

答案 0 :(得分:2)

允许不同的C#类型映射到不同的OracleDbType;在this question的答案中显示了一个好的列表。

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

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

这使其成为OracleDbType.Decimal,任何ulong号码都可转换为。{/ p>