Oracle列/值大小问题

时间:2011-03-02 07:56:42

标签: c# oracle copy odp.net bulk

我正在使用ODP.NET和Oracle 10g将数据从数据表传输到db表。 我遇到的问题是在尝试将值插入NUMBER(12,3)列时。值为100100100,55 - 我收到错误: 行'1'列'6'出错 ORA-26093:输入数据列大小(24)超过最大输入大小(22)

但如果我尝试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);

4 个答案:

答案 0 :(得分:3)

当您在示例代码dt.Columns.Add()中创建类似DataTable列时,默认为键入字符串

我遇到了类似的问题,发现问题是当字符串长度超过11 时, oracle批量复制无法处理将字符串转换为十进制或长整数。

要解决此问题,您需要确保源数据类型是十进制或长数,而不是字符串。在您的示例代码中,您可以使用dt.Columns.Add("QTY", typeof(decimal));

执行此操作

详细说明:

从我收集的内容,错误消息实际上告诉我们这种转换的最大字符串长度是11.消息中的那些(24)和(22)引用是输入的字符串长度和允许的最大x我的字符串是26641778.595,长度为12,包括小数点。如果我添加了一个数字,则消息更改为(26)等。同样,我也有一个普通旧数字的问题,如123456789012,长度为12。

答案 1 :(得分:1)

NUMBER(12,3)应该保留您正在尝试的值没有问题。如果超过数字列的精度,则更有可能出现的错误为ORA-01438: value larger than specified precision allowed for this column

听起来这个错误可能与表格中的不同列有关。您似乎只在插入中指定了一列,但错误引用了column '6'。表中的其他列是什么?

答案 2 :(得分:1)

Oracle doument“OracleBulkCopy在精确插入NUMBER列时引发ORA-26093(Doc ID 1382276.1)”中回答了这个问题。

简而言之:

  

原因:这是设计和预期的行为。默认类型是   System.String。

     

SOLUTION:指定列数据类型

所以而不是:

dt.Columns.Add();

应该写:

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

答案 3 :(得分:0)

此错误通常是由元数据不匹配引起的 - 而不是值错误。确认您在.Net端使用的数据类型与ORacle端的数字(12,3)列规范一致。尝试将其作为“double”传递(在应用程序中转换为double),看看是否能解决问题。