oracle writetoserver,关于c#:Oracle列/值大小问题

我正在使用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),看看是否可以解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值