向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中有什么设置是我应该知道的吗?
我知道为什么我得到这个错误。在幕后。net框架使用SQL_VARBINARY类型来绑定参数。对于Oracle,此类型限制为2000字节。
为了解决这个问题,我需要切换到SQL_LONGVARBINARY类型。OdbcParameter为参数大小> 8000字节自动执行此操作。所以我的代码可能在范围大小<2000和尺寸> 8000。为了强制OdbcParameter使用SQL_LONGVARBINARY,我可以显式地设置较大的参数大小。根据文档:
对于变长数据类型,Size描述的是要传输到服务器的数据
如果我没有明确指定Size,它默认为实际数组大小并导致错误。
通常Blob数据长度限制以tb为单位。然而,char、nchar等的数据长度限制是2000字节。您是否将数据转移到任何这样的领域?
另一个点。检查缓冲区长度。这可能是一个限制因素