2015-07-10 28 views
0

我有一個BLOB字段的表,我正在向此表中插入二進制數據。一切順利,除非我指定一個超過2000字節的二進制數據。在這種情況下,我發現了以下錯誤:將BLOB寫入Oracle數據庫時發生無效的精確值錯誤

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

我想出了爲什麼我得到這個錯誤。在幕後.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

如果我不指定大小明確默認爲實際的數組大小和導致錯誤。

0

通常,Blob數據長度限制運行到TB。然而char,nchar等的datalenght限制是2000字節。你是否將數據轉移到任何這樣的領域?
另一點。檢查緩衝區的長度。這可能是一個限制因素

+0

我檢查了幾次數據類型真的是BLOB。我也嘗試用SQLPlus選擇插入的字節,並且我得到了小字節數組的正確結果。我想知道這是否是一個驅動因素問題。 – username

+0

驅動程序緩衝區長度「DefaultLongDataBuffLen」被設置爲1024KB,這似乎足夠了。感謝您的想法。 – username

+0

插入語句有400個字節的限制。但是,您可以通過將其封裝在pl/sql中來繞過它... Begin Block塊 –

相關問題