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

时间:2015-07-10 17:29:48

标签: c# oracle odbc blob

我有一个带有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 <= 2000时才有效。在Oracle中是否有任何设置应该知道哪些可以有所作为?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

为了解决这个问题,我需要切换到SQL_LONGVARBINARY类型。 OdbcParameter会自动为参数大小&gt;执行此操作。 8000字节。所以我的代码可能在范围大小&lt; 2000和尺寸&gt; 8000.为了强制OdbcParameter使用SQL_LONGVARBINARY,我可以显式设置大参数大小。根据{{​​3}}:

  

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

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