我正在使用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);
考虑一下,我认为我的回答无济于事,所以我删除了它,我认为此错误有一个特定于Oracle的地方,因为这似乎表示您的总数为12位的数字为24号且不适合22号 建议您编辑此问题,尤其是标题,以使其成为通用的Oracle问题,您可能会吸引更多的人关注此问题,并希望能得到更好的答案。
您的专栏是12,3,那么您怎么能超过22的最大输入?
ODP.net是什么版本
其11.1.0。 Ive还编辑了问题,并添加了引发该异常的C#代码示例
我想知道100100100.11是否在内部存储为浮点数,这也许不可能精确地存储在小数点后的2位。 但是,通常情况下,我希望发送给Oracle时,它将自动将任何浮点数截断为所需的精度。 有趣的问题。
在示例代码dt.Columns.Add()中创建DataTable列时,默认情况下键入string。
我有一个类似的问题,发现问题是当字符串长度超过11时,oracle批量复制无法处理将字符串转换为十进制或长整数的问题。
要解决此问题,您需要确保源数据类型是十进制或长整数,而不是字符串。在示例代码中,您可以使用dt.Columns.Add("QTY", typeof(decimal))来完成;
细节:
根据我的收集,错误消息实际上告诉我们这种转换的最大字符串长度为11。消息中的那些(24)和(22)引用是输入的字符串长度,最大允许长度x 2。输入的字符串是26641778.595,长度为12(包括小数点)。如果我添加一个数字,则消息更改为(26)等。同样,我也遇到了一个普通的旧数字的问题,例如123456789012,长度为12。
在Oracle doument"当以精确度插入NUMBER列时,OracleBulkCopy抛出ORA-26093(文档ID 1382276.1)"中回答了此问题。
简而言之:
CAUSE: This is by design and expected behavior. The default type is
System.String.
SOLUTION: Specify column datatype
所以代替:
dt.Columns.Add();
一个人应该写:
DataColumn dc = new DataColumn();
dc.DataType = Type.GetType("System.Double");
dc.ColumnName ="QTY";
dt.Columns.Add(dc);
NUMBER(12,3)应该可以毫无问题地保存您尝试的值。而且,如果您超出了数字列的精度,则得到的错误更有可能是ORA-01438: value larger than specified precision allowed for this column。
听起来错误可能与表中的其他列有关。您似乎只在插入内容上指定了一列,但是错误引用了column '6'。表格中的其他列是什么?
此错误通常是由于元数据不匹配而不是值错误引起的。确认您在.Net端使用的数据类型与ORacle端的number(12,3)列规范一致。尝试将其传递为" double"(在应用程序中转换为double),看看是否可以解决问题。