【问题标题】:Oracle Client throws ArgumentException with ulong parameterOracle 客户端抛出带有 ulong 参数的 ArgumentException
【发布时间】:2014-01-28 02:34:43
【问题描述】:

我需要在 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)

为什么会这样?

附:我尝试过同时使用 Oracle.DataAccess 2.112.1.2 和 Oracle.ManagedDataAccess 4.212.1.0。

【问题讨论】:

  • 请显示表架构声明。
  • 在 C# 注释中给出,但这里是:CREATE TABLE SampleTable (SampleColumn NUMBER)
  • 如果在参数调用中明确设置数据类型会怎样?
  • 嗯,看来你正在做某事;似乎没有 OracleDbType.UInt64,只有 OracleDbType.Int64。我不确定这里适合使用哪种 OracleDbType。

标签: oracle oracleclient odac argumentexception ulong


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-05-01
    • 1970-01-01
    • 2019-02-26
    • 2016-07-28
    • 2012-08-10
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多