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中去。不要太爽好不好

时间: 2024-10-15 11:03:59

odp.net使用时,指定的转换无效的相关文章

数据库还原错误:指定的转换无效。(SqlManagerUI)

SSMS在一定程度上方便我们进行一些常见的操作.但有时候它处理得又不是那么不人性化.尤其是错误信息. 今天我在进行数据库还原的时候就碰到一个错误:指定的转换无效.(SqlManagerUI) Specified cast is not valid.(SqlManagerUI) 没办法,不得不敲代码了: RESTORE HEADERONLY FROM DISK = N'D:\XXDB.BAK' GO 看到的居然是这个: 原来是备份的时候加密了.加密就加密嘛,居然报转换无效的错误..... 找到密码

EF6+SQLite3数据库出现类型转换失败的问题(指定的转换无效)

我这里出现这个问题的原因是,数据库中这个model的一个列内容全部为null,所以这里转换失败 但是我在数据库设置了可以为null(否则也设置不了null值),然后VS里面根据数据库生成模型,Nullable<long>,说这个值类型也可以和引用类型一样为null 结果我发现我被骗了,倒腾了半天我把这个列的数值全部设上值,才正常显示了 暂时只能这样解决了.

MyBatis 指定的转换无效

表字段Pay类型设置的是float,生成类的属性如下: public double Pay{get;set;} 读取列表时出现如下错误: 错误信息: 查看堆栈跟踪信息, get_Decimal()提示数据类型转换错误.查看原因原来是Pay值存放着int型数值,这才转换出错,Pay值是null的情况不会转换错误.

从具体化“System.Data.Objects.MaterializedDataRecord”类型到“XXXX”类型的指定强制转换无效。

在EF里面使用CreateQueryl的时候出现异常 这是原来有问题的代码 se.CreateQuery<Departments>("SELECT Departments.dId, Departments.dName, Departments.dManager FROM Departments") .ToList().ForEach(w => { System.Console.WriteLine(w.dId + " " + w.dName + &q

Rich 七哥博客园:虚拟机报错问题描述:vmware没有正常关闭,再次打开使用时蓝屏,在安全模式下再次打开不会蓝屏,但提示“无法打开内核设备 \\.\Global\vmx86: 系统找不到指定的文件,你想要安装VMware Workstation前重启吗?&quot; ”

今天在打开虚拟机时遇到报错: 问题描述:vmware没有正常关闭,再次打开使用时蓝屏,在安全模式下再次打开不会蓝屏,但提示“无法打开内核设备 \\.\Global\vmx86: 系统找不到指定的文件,你想要安装VMware Workstation前重启吗?"”这是因为虚拟机服务没有开启:点击“开始→运行”,在运行框中输入 CMD 回车打开命令提示符,然后依次执行以下命令. net start vmci net start vmx86 net start VMnetuserif sc config

EntityFrameWork 使用时碰到的小问题

EntityFrameWork 使用时碰到的小问题 1,在使用orm访问数据库的相目里,也要引用EntityFrameWork.dll,否则无法使用orm 否则,编译错误 错误 5 "System.Data.Entity.DbSet`1<DbAccess.Entity.Dept>"不包含"Where"的定义,并且找不到可接受类型为"System.Data.Entity.DbSet`1<DbAccess.Entity.Dept>&qu

如何处理Spring、Ibatis结合MySQL数据库使用时的事务操作

Ibatis是MyBatis的前身,它是一个开源的持久层框架.它的核心是SqlMap--将实体Bean跟关系数据库进行映射,将业务代码和SQL语句的书写进行分开.Ibatis是"半自动化"的ORM持久层框架.这里的"半自动化"是相对Hibernate等提供了全面的数据库封装机制的"全自动化"ORM实现而言的,"全自动"ORM实现了POJO与数据库表字段之间的映射并且实现了SQL的自动生成和执行.而Ibatis的着力点,则在于P

如何处理Ibatis结合MySQL数据库使用时的事务操作

Ibatis是MyBatis的前身,它是一个开源的持久层框架.它的核心是SqlMap--将实体Bean跟关系数据库进行映射,将业务代码和SQL语句的书写进行分开.Ibatis是"半自动化"的ORM持久层框架.这里的"半自动化"是相对Hibernate等提供了全面的数据库封装机制的"全自动化"ORM实现而言的,"全自动"ORM实现了POJO与数据库表字段之间的映射并且实现了SQL的自动生成和执行.而Ibatis的着力点,则在于P

实战Java内存泄漏问题分析 -- hazelcast2.0.3使用时内存泄漏 -- 1

公司当年有一个自己缓存集群用户session的Java library,是基于hazlcast2.0.3实现的,最近在customer site集群环境中某个blade报了Out of Memory Exception, 其他blades都正常,马上用jrockit jrcmd命令dump了堆和线程进行分析. printf "##################### heap ##################\n" su -p occas -c "/opt/jrocki