我正在使用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);
答案 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),看看是否能解决问题。