如何防止溢出,而读取oracle FLOAT(126)与许多数字后的小数到ADO.净数据表

本文关键字:数字 许多 小数 数据表 ADO 溢出 何防止 读取 oracle FLOAT | 更新日期: 2023-09-27 18:11:45

当一个数据库列包含像0.11212121212121356500008888888888874343468766这样的数字时,它不能适合DataRow生成的Decimal-type列。这同样适用于DataReader。使用DataReader,我用wrapper解决了这个问题:

public class OracleDataReaderWrapper : DbDataReader
{
   DbDataReader _realReader;
    public OracleDataReaderWrapper(DbDataReader realReader)
    {
       _realReader = realReader;
    }
//... all other methods
    public override object GetValue(int ordinal)
    {
        if (_realReader is System.Data.OracleClient.OracleDataReader)
        {
            Type fieldType = _realReader.GetFieldType(ordinal);
            if (fieldType == typeof(Decimal))
            {
                return (decimal)((double)((System.Data.OracleClient.OracleNumber)_realReader.GetProviderSpecificValue(ordinal)));
            }
//...

但是我怎么能用DataSet, DbDataAdapter做点什么呢?使用ROUND或TRUNC重写所有datadapter-Select命令不仅是错误的,而且毫无疑问,因为已经有数百个地方可以更改它。

注意这也适用于ODP.NET。这里的类型是OracleDecimal而不是OracleNumber。我的包装器用于两个客户机。

如何防止溢出,而读取oracle FLOAT(126)与许多数字后的小数到ADO.净数据表

var oracleValue = (OracleDecimal)reader.GetOracleValue(0);
var netValue = (decimal)(OracleDecimal.SetPrecision(oracleValue, 28));

当然,如果你不介意失去精度的话