2011-03-02 79 views
4

我正在使用ODP.NET和Oracle 10g將數據從數據表傳輸到數據庫表。 我正面臨的問題是,當試圖將一個值插入NUMBER(12,3)列時。該值是100100100,55 - 我得到的錯誤: 錯誤行「1」列「6」 ORA-26093:輸入數據列的大小(24),超過最大輸入的大小(22)Oracle列/值大小問題

但是,如果我嘗試100100100,5它工作正常

此錯誤消息對我沒有意義。

任何人都可以解釋我爲什麼嗎? 謝謝!

而且,這裏是拋出這個錯誤的代碼段:

 OracleBulkCopy bc = new OracleBulkCopy(DBFacade.DbConnection); 
     DataTable dt = new DataTable(); 
     dt.Columns.Add(); 
     dt.Rows.Add(100100100.11); 
     bc.DestinationTableName = "tmp_import_bom"; 
     bc.ColumnMappings.Add(0, "QTY"); 
     bc.WriteToServer(dt); 
+0

關於它的思考我認爲我的答案沒有幫助,所以我刪除了它,我認爲有一些特定於此錯誤的Oracle,因爲它似乎表示您的總數爲12的數字大小爲24,並且不適合22.我建議編輯這個問題,特別是標題,使其成爲一個通用的Oracle問題,你可能會有更多的人看着它,並希望得到更好的答案。 – 2011-03-02 09:10:45

+0

感謝您的意見 – maephisto 2011-03-02 09:31:32

+0

您的專欄是12,3所以你如何超過最大輸入22? – V4Vendetta 2011-03-02 10:24:08

回答

1

一個NUMBER(12,3)應該抱你是沒有問題的努力的價值。如果你超過了數字列的精度,那麼你得到的錯誤更可能是ORA-01438: value larger than specified precision allowed for this column

這聽起來像錯誤可能與表中的不同列有關。您似乎只在插入時指定了一列,但錯誤參考column '6'。表中的其他欄是什麼?

0

此錯誤通常是由於元數據不匹配導致的 - 不是值錯誤。確認您在.Net端使用的數據類型與ORacle端的數字(12,3)列規格一致。嘗試將它作爲'double'傳遞(在應用程序中轉換爲double)並查看是否可以解決問題。

3

當您在示例代碼dt.Columns.Add()中創建一個DataTable列時,它的默認值爲,該值爲

我有一個類似的問題,並發現問題是,oracle批量複製不能處理轉換字符串爲十進制或長,當字符串長度超過11

要解決該問題,您需要確保源數據類型是十進制或長整型,而不是字符串。在你的示例代碼中,你可以用dt.Columns.Add("QTY", typeof(decimal))來做到這一點;

詳情:

從我所收集的錯誤消息實際上是告訴我們,這種轉換的最大字符串長度爲11的那些(24)和(22)在消息中引用的字符串長度的輸入和最大允許的x 2.我的字符串進來是26641778.595這是長度12包括小數點。如果我添加了一個數字,則消息變爲(26)等等。再次,我也有一個普通的舊數字,例如長度爲12的123456789012的問題。

1

此問題在Oracle doument「OracleBulkCopy Throws ORA-26093使用精度插入到NUMBER列時(文檔ID 1382276.1)「。

簡而言之:

原因:這是由設計和預期的行爲。默認類型是 System.String。

解決方案:指定列數據類型

所以不是:

dt.Columns.Add(); 

應該寫:

DataColumn dc = new DataColumn(); 
dc.DataType = Type.GetType("System.Double"); 
dc.ColumnName = "QTY"; 
dt.Columns.Add(dc);