odp.net使用时,指定的转换无效 原

正在做数据库备份与还原。

我用odp.net通过存储过程+OracleDataAdapter,将数据表直接返回到dataset中,但提示“指定的转换无效”。我就纳闷了,为什么报表应用及查询时,不报这个错,而导出物理表,就报这个错呢。

查资料得知原因: 

the OracleDataAdapter class attempts to map Oracle native data types to .NET data types

NUMBER,  DATE , TIMESTAMP , TIMESTAMP WITH LOCAL TIME ZONE  ,TIMESTAMP WITH TIME ZONE , INTERVAL DAY TO SECOND 

上面几种类型可能由于数据库精度和.net的精度 不同,引起异常。比如数据库number是38位,但Decemal只是28位。

 Oracle decided that the best way to store these types of data in a Dataset object without losing any detail would be either as a byte array or a string

oracel建议用户 manually define this mapping!

_myAdapter.SafeMapping.Add("LaunchDate", typeof(string));                              _myAdapter.SafeMapping.Add("ExpiryDate", typeof(byte[])); 

那这么多表,我怎么知道哪个列的精度不对呢?我所有的数据都是number类型。于是写了段代码,

用OracleDataReader循环读列,找出问题列!        

OracleDataReader reader = cmd.ExecuteReader();
int x = 0;
do
{
    Trace.WriteLine("表" + (++x));
    while (reader.Read())
    {
        string result = reader.GetString(3) + "-" + reader.GetString(4) + "+";
        for (int j = 6; j < reader.FieldCount - 1; j++)
        {
            try
            {
                if (!reader.IsDBNull(j) && reader.GetFieldType(j)==typeof( decimal))  
                    result += (reader.GetDecimal(j).ToString() + ",");
                else
                    result += ("null,");
            }
            catch (Exception ex)
            {
                Trace.WriteLine("wrong filed "+j+"   "+result);
                conn.Close();
                throw;
            }
        }
        Trace.WriteLine(result);
    }
} while (reader.NextResult());

终于找到了 问题列!

其实用到几处OracleDataReader 的知识点

reader.Read()  reader.IsDBNull(j)  reader.GetFieldType(j)  reader.NextResult()

NextResult就是在多个结果集间循环。因为我过程一次性返回了20个游标集。

大家看,用OracleDataReader就是如此复杂,但我已经找到了问题列,从库里把数据修改成精度以内之后。就可以这样:

OracleDataAdapter oda = new OracleDataAdapter(cmd);

oda.Fill(ds);

就两句话,一次性把所有的表统统转存到了dataset中去。不要太爽好不好

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

SQL server 数据导入导出BCP工具使用详解

    数据的导入导出是数据库管理员常见的工作任务之一,尤其是平面文件的导入导出。BCP 工具则为这些任务提供了强有力的支持,它是基于DB-Library,尤其...

25920
来自专栏杨建荣的学习笔记

由一条报警信息发现的一系列问题(r7笔记第67天)

今天看到一条报警短信,提示是某个表空间的问题。 ZABBIX-监控系统: ------------------------------------ 报警内容:...

37990
来自专栏数据库新发现

Oracle HowTo:如何快速杀死占用过多资源(CPU,内存)的数据库进程

作者:eygle 出处:http://www.eygle.com/blog 日期:October 27, 2005 本文链接:...

10430
来自专栏沃趣科技

数据库对象事件与属性统计 | performance_schema全方位介绍

上一篇《事件统计 | performance_schema全方位介绍》详细介绍了performance_schema的事件统计表,但这些统计数据粒度太粗,仅仅按...

47140
来自专栏Jerry的SAP技术分享

如何处理用代码创建SD Sales order时遇到的错误消息KI 180

错误消息KI 180:You must enter a company code for transaction Create sales document

16140
来自专栏更流畅、简洁的软件开发方式

很简单的企业管理器---我写程序的方式,几个自定义控件。

这里呢我利用我常用的东东写个实例,抛砖引玉,大家也都来批批,帮助我提高嘛。 我常用的呢是 数据访问层(简单理解是SQLHelp,但是绝不等于)、分页控件等自定...

22280
来自专栏杨建荣的学习笔记

关于查看dba_data_files的一个小问题(r7笔记第72天)

今天帮一个朋友看一个pl/sql的问题,他已经钻到一个死胡同里列,可能明眼人一看就知道哪里有问题,但是当局者迷,所以我抽空看了一下这个pl/sql块。 pl/s...

40450
来自专栏乐沙弥的世界

启用用户进程跟踪

仅仅需要标识该会话并为该会话启用跟踪(专用模式为一对一模式,即一个用户进程对应一个服务器进程)

10320
来自专栏乐沙弥的世界

数据泵 EXPDP 导出工具的使用

对于Oracle 数据库之间的导入导出,可以使用Oracle提供的导入导出工具EXP/IMP来实现。EXP/IMP是Oracle早期提供的数据导入导出工具。在...

20630
来自专栏杨建荣的学习笔记

11g主库归档自动删除的小问题分析 (r8笔记第1天)

最近在无疑中查看一个数据库的日志的时候,发现里面有这么一段内容。 Sat Feb 06 10:07:25 2016 Deleted Oracle manag...

358110

扫码关注云+社区

领取腾讯云代金券