前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >odp.net使用时,指定的转换无效 原

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

作者头像
申君健
发布2018-09-21 09:59:43
1.3K0
发布2018-09-21 09:59:43
举报
文章被收录于专栏:前端侠2.0

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

我用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循环读列,找出问题列!        

代码语言:javascript
复制
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 的知识点

代码语言:javascript
复制
reader.Read()  reader.IsDBNull(j)  reader.GetFieldType(j)  reader.NextResult()

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

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

OracleDataAdapter oda = new OracleDataAdapter(cmd);

oda.Fill(ds);

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015/07/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库备份服务
数据库备份服务(Database Backup Service,简称 DBS)是为用户提供连续数据保护、低成本的备份服务。数据库备份拥有一套完整的数据备份和数据恢复解决方案,具备实时增量备份以及快速的数据恢复能力,它可以为多种部署形态的数据库提供强有力的保护,包括企业 IDC 数据中心、其他云厂商数据库及腾讯公有云数据库。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档