当数据库列包含 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。我的包装器用于两个客户端。