4

我正在使用 ODP.NET 和 Oracle 10g 将数据从数据表传输到数据库表。我面临的问题是尝试将值插入 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

4 回答 4

3

当您在示例代码中创建类似的 DataTable 列时dt.Columns.Add(),它默认为类型 string

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

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

细节:

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

于 2013-01-22T18:16:42.213 回答
1

ANUMBER(12,3)应该毫无问题地保持您正在尝试的值。如果您超出了数字列的精度,您得到的错误很可能是ORA-01438: value larger than specified precision allowed for this column.

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

于 2011-03-02T14:40:59.167 回答
1

这个问题在 Oracle doument “OracleBulkCopy Throws ORA-26093 When Inserting into NUMBER Column With Precision (Doc 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);
于 2015-07-27T15:24:07.063 回答
0

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

于 2011-03-02T17:29:49.223 回答