2013-06-30 15 views
8

Sto usando il seguente codice per Bulk inserire una tabella di dati in mio tavolo SQL:precisione persa mentre record Inserimento di massa in SQL utilizzando SqlBulkCopy

// Set up the bulk copy object. 
       using (SqlBulkCopy bulkCopy = 
          new SqlBulkCopy(destinationConnection.Connection)) 
       { 
        bulkCopy.DestinationTableName = 
         Constants.ReportDataTable; 

        // Write from the source to the destination. 
        DataTable dtBulk = GetDatatableInReportDataFormat(dt, objectName, version); 
        bulkCopy.WriteToServer(dtBulk);//To get the Datatable in the SQL table format 

       } 

ho una colonna nella mia tabella SQL denominato "Valore", il suo tipo è decimale (28,5). Il mio problema è che alcuni valori con numeri decimali vengono automaticamente arrotondati, quindi sto perdendo la precisione, ad esempio un valore di 0.72768 viene salvato come 0.72767.

Nel Datatable, la colonna "Valore" è di tipo Double.

Qualsiasi organismo ha un'idea? Grazie

+0

Perché il tipo non è "decimale" nel DataTable? Non tutti i numeri possono essere esattamente rappresentati in virgola mobile (lo stesso vale per i decimali, ma l'arrotondamento funziona più come gli utenti si aspettano, piuttosto che i computer) –

+0

0,72767 non ha un valore arrotondato di 0,72768. –

+0

hai ragione, non è arrotondato, ma non è memorizzato come dovrebbe –

risposta

7

Rendere la colonna nel DataTable come decimal anziché double ... Ho il forte sospetto che questo farà scomparire il problema.

+0

Grazie per la tua risposta, testerò e ti ricontatteremo –

+0

L'ho provato sul mio computer, sql express 2008, e funziona bene prima di impostare il tipo di colonna in decimale, su sql 2008 R2, sta cambiando i valori, proverò su R2 2008 e tornerò da te –

+0

Grazie amico, ha funzionato :) –

3

La precisione decimale di un doppio non è fissa, anche se è doppia o maggiore di 128 bit. Quindi non è un "errore di arrotondamento". Detto semplicemente, non è garantito che un doppio rappresenti tutti i numeri reali all'interno di un intervallo di punti decimali limitato. Questa perdita di precisione aumenta ulteriormente quando si tenta di memorizzare numeri più grandi o numeri molto vicini allo zero.

http://en.wikipedia.org/wiki/Double-precision_floating-point_format

Se sei memorizzare numeri reali che hanno bisogno di garanzie circa la precisione decimale come i valori monetari, longitudine/latitudine o simili quindi memorizzarli come tipo decimale.

Un uppdate: in realtà nessuna precisione viene fissata con double (o single/float) se si memorizzano numeri veramente grandi allora ci saranno numeri interi che non si possono rappresentare perché perdita di precisione e Se un calcolo dovrebbe risultare in un valore così vicino il numero intero rappresentabile verrà calcolato e memorizzato.

+0

Grazie per la spiegazione :) –