【问题标题】:Invalid precision value error when writing BLOB to Oracle database将 BLOB 写入 Oracle 数据库时出现无效精度值错误
【发布时间】:2015-09-29 13:30:45
【问题描述】:

我有一个带有 BLOB 字段的表,并且我正在向该表中插入一个二进制数据。除非我指定超过 2000 字节的二进制数据,否则一切顺利。在这种情况下,我会收到以下错误:

ERROR [HY104][ODBC Oracle Wire Protocol driver]Invalid precision value. Error in parameter 1
   at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
   at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)
   at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader)
   at System.Data.Odbc.OdbcCommand.ExecuteNonQuery()

对于 BLOB 数据类型,是否有任何原因导致操作失败并出现此错误?我在 Oracle 11.2 和 12 上测试了这种行为,我看到了相同的行为。 这是我用来更新 BLOB 的代码:

public override void WriteBlob(int id, byte[] data)
{
    var cmd = GetConnection().CreateCommand();
    cmd.CommandText = "update TB_BLOBS set TB_BLOB=? where TB_ID=?";

    cmd.Parameters.Add(new OdbcParameter
    {
        DbType = DbType.Binary,
        ParameterName = "TB_BLOB",
        Value = data
    });

    cmd.Parameters.Add(new OdbcParameter
    {
        DbType = DbType.Int32,
        ParameterName = "TB_ID",
        Value = id
    });

    cmd.ExecuteNonQuery();
}

它仅在 data.Length

【问题讨论】:

    标签: c# oracle odbc blob


    【解决方案1】:

    通常,Blob 数据长度限制为 TB。但是 char、nchar 等的数据长度限制为 2000 字节。您是否将数据转移到任何此类领域?
    还有一点。检查缓冲区长度。这可能是一个限制因素

    【讨论】:

    • 我检查了几次数据类型确实是BLOB。我还尝试使用 SQLPlus 选择插入的字节,并且我得到了小字节数组的正确结果。我想知道这是否可能是驱动程序问题。
    • 驱动缓冲区长度“DefaultLongDataBuffLen”设置为 1024KB,这似乎足够了。感谢您的想法。
    • 插入语句有 400 个字节的限制。但是,您可以通过将其包装在 pl/sql Begin... End 块中来绕过它
    • 插入语句有 400 个字节的限制。但是,您可以通过将其包装在 pl/sql Begin... End block 中来绕过它。还要检查 setBytes 是否切换到 setBinaryStream。默认情况下,它设置为 2000 字节。检查 SetBigStringTryClob 连接属性可能也是值得的,因为它设置为更高的值。您的 code-sn-p 也不清楚,但一般建议是使用 getBlob 而不是 getString 或 getBytes
    【解决方案2】:

    我知道为什么会出现这个错误。在幕后 .NET 框架使用 SQL_VARBINARY 类型来绑定我的参数。对于 Oracle,此类型限制为 2000 字节。

    为了解决这个问题,我需要切换到 SQL_LONGVARBINARY 类型。对于大于 8000 字节的参数大小,OdbcParameter 会自动执行此操作。所以我的代码可能在大小 8000 的范围内工作。为了强制 OdbcParameter 使用 SQL_LONGVARBINARY,我可以显式设置大参数大小。根据documentation

    对于可变长度数据类型,Size 描述了最大数量 数据传输到服务器

    如果我没有明确指定 Size,它默认为实际数组大小并导致错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 2016-10-09
      • 2022-10-21
      • 1970-01-01
      • 2018-11-19
      相关资源
      最近更新 更多