将 BLOB 写入 Oracle 数据库时出现无效精度值错误

Invalid precision value error when writing BLOB to Oracle database

我有一个带有 BLOB 字段的 table,我正在向这个 table 中插入一个二进制数据。一切顺利,除非我指定一个超过 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 <= 2000 时有效。Oracle 中是否有任何我应该知道的设置可以有所作为?

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

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

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

For variable-length data types, Size describes the maximum amount of data to transmit to the server

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