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.
En fait, il semble être Fill int virtuel protégé ( \t DataTable dataTable, \t IDataReader datareader –
plus précisément: DataAdapter.Fill (DataSet, String, IDataReader, Int32, Int32) –