如何防止溢出,而读取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。我的包装器用于两个客户机。
var oracleValue = (OracleDecimal)reader.GetOracleValue(0);
var netValue = (decimal)(OracleDecimal.SetPrecision(oracleValue, 28));
当然,如果你不介意失去精度的话