SqlBulkCopy non sta copiando tutti i dati in una colonna

.net sql sqlbulkcopy vb.net visual-studio-2012

Domanda

Sto SqlBulkCopy un problema in cui SqlBulkCopy non sta copiando tutti i dati in una colonna sulla tabella di destinazione. Ho verificato che i dati di origine (che è un file .CSV ) hanno valori nella colonna in tutte le righe, ma solo le prime 40 righe in quella colonna vengono copiate.

Le colonne della tabella di destinazione sono impostate su NVARCHAR(255) e tutte possono essere annullabili.

Ecco la mia funzione per fare la copia in blocco:

Private Sub loadDataFromCSV(ByVal pathToFile As String, ByVal connString As String, ByVal file As String, ByVal colCount As Integer)
        Dim fileLocation As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & pathToFile & ";Extended Properties='text;HDR=NO;FMT=Delimited(,)';"
        Dim qry As String = "select * from " & file
        Dim CompData As OleDbDataReader
        Using destConnection As SqlConnection = _
           New SqlConnection(connString)
           destConnection.Open()

            Using sourceConnection As New OleDbConnection(fileLocation)
                Dim cmdSourceData As New OleDbCommand(qry, sourceConnection)
                sourceConnection.Open()
                CompData = cmdSourceData.ExecuteReader()

                Using bulkCopy As SqlClient.SqlBulkCopy = New SqlClient.SqlBulkCopy(connString)
                    bulkCopy.DestinationTableName = "dbo.Records"
                    bulkCopy.BatchSize = 10000
                    bulkCopy.BulkCopyTimeout = 90

                    Try
                        bulkCopy.WriteToServer(CompData)

                    Catch ex As Exception
                        Console.WriteLine(ex.Message)

                    Finally
                        CompData.Close()
                    End Try
                End Using
            End Using
        End Using
    End Sub

Per quello che posso dire, tutti i dati della tabella stanno passando alle colonne corrette, con l'eccezione della settima colonna. Nella settima colonna, ottengo le prime 40 righe di dati, quindi il resto dei valori per la colonna è NULL.

Ho finito le idee per quello che poteva andare storto, quindi qualsiasi aiuto sarebbe molto apprezzato.

Grazie.

Risposta accettata

La mia ipotesi sarebbe che sono errori di coverion. OLEDB dedurrà il tipo di dati di una colonna in base alle prime 8 righe (credo) quindi se le tue prime righe sono:

SomeColumn
----------
    1
    2
    3
    4
    5
    6
    7
    8
    9
    apple

Inizialmente sembra una colonna intera, quindi questo è ciò a cui è mappato, ma quando arriva a "apple" non può convertirlo in un numero intero, quindi restituisce DbNull.

La soluzione a questo è di aggiungere IMEX=1 alla stringa di connessione, questo significa che non verrà eseguita alcuna conversione implicita e OleDbReader leggerà esattamente ciò che c'è nel csv.

Lo svantaggio di questo è che probabilmente otterrai errori di conversione quando provi a chiamare il SqlBulkCopy.WriteToServer(DataReader) . Potrebbe essere necessario creare un DataTable nello stesso formato della tabella del database e iterare su OleDbReader eseguendo conversioni esplicite dove necessario, quindi scrivere questo DataTable nel database con SqlBulkCopy.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow