2011-03-02 246 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);