我有一个带有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中是否有任何设置应该知道哪些可以有所作为?
答案 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,则默认为实际的数组大小并导致错误。