1

Lorsqu'une colonne de base de données contient un nombre comme 0.11212121212121356500008888888888874343468766, elle ne peut pas être adaptée à la colonne Décimale générée par DataRow. Ceci est également valable pour DataReader. Avec DataReader j'ai résolu ce avec emballage:Comment empêcher le débordement lors de la lecture de FLOAT oracle (126) avec plusieurs chiffres après la virgule décimale vers ADO.NET DataTable?

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))); 
      } 
//... 

Mais comment puis-je faire quelque chose avec DataSet, DbDataAdapter? Réécrire tout l'adaptateur de données - Sélectionner des commandes avec ROUND ou TRUNC n'est pas seulement faux, c'est hors de question car il y a déjà des centaines d'endroits pour le changer.

NOTE ceci s'applique également à ODP.NET. Le type est OracleDecimal au lieu de OracleNumber. Mon wrapper est utilisé pour les deux clients.

+0

En fait, il semble être Fill int virtuel protégé ( \t DataTable dataTable, \t IDataReader datareader –

+0

plus précisément: DataAdapter.Fill (DataSet, String, IDataReader, Int32, Int32) –

Répondre

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

Bien sûr, si vous ne parvenez pas à perdre la précision.

+0

Merci, mais datareader a déjà été résolu. Ur peut être meilleur et je peux regarder dedans, mais la question était au sujet de DbDataAdapter.Fill ou en général peupler DataTable mais de toute façon je pense que j'ai trouvé une solution moi-même (je peux lui donner un lecteur de données, voir mes commentaires dans le poteau original) –

+0

Eh bien, le problème est que OracleDataReader est utilisé en arrière-plan lorsqu'il s'agit de OracleDataAdapter, rendant l'implémentation de DbDataAdapter propre à assurer la précision est acceptable pour le type de données décimal ne devrait pas être un problème. – Husqvik