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

本文关键字:无效 精度 错误 数据库 Oracle BLOB | 更新日期: 2023-09-27 18:02:02

我有一个带有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和Oracle 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();
}

只有当数据。长度<= 2000。在Oracle中有什么设置是我应该知道的吗?

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

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

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

对于变长数据类型,Size描述的是要传输到服务器的数据

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

通常Blob数据长度限制以tb为单位。然而,char、nchar等的数据长度限制是2000字节。您是否将数据转移到任何这样的领域?
另一个点。检查缓冲区长度。这可能是一个限制因素