1

当数据库列包含 number like0.11212121212121356500008888888888874343468766时,它​​不能适合 DataRow 生成的 Decimal 类型列。这同样适用于 DataReader。使用 DataReader 我已经用包装器解决了这个问题:

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。我的包装器用于两个客户端。

4

1 回答 1

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

当然,如果您对失去精度感到满意。

于 2015-09-09T07:55:23.897 回答