Utilizzo di SqlBulkCopy per l'inserimento in SQL

sqlbulkcopy sql-server vb.net

Domanda

Non so perché i dati non stanno entrando in SQL. Qualcuno può rivedere questo e vedere cosa c'è di sbagliato nel mio codice? Ho ricevuto la maggior parte del codice qui sotto e la pagina MSDN: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy(v=vs.110).aspx

Dim connectionString As String = "Server= "<servername>"; integrated security=true"

    Using sourceConnection As SqlConnection = _

        New SqlConnection(connectionString)
        sourceConnection.Open()

        Dim commandSourceData As SqlCommand = New SqlCommand(<TSQL>), sourceConnection)
        Dim reader As SqlDataReader = commandSourceData.ExecuteReader

        Using destinationConnection As SqlConnection = _
            New SqlConnection(connectionString)
            destinationConnection.Open()

            Using bulkcopy As SqlBulkCopy = _
                New SqlBulkCopy(destinationConnection)
                bulkcopy.DestinationTableName = _
                    "<tableName>"

                Try
                    bulkcopy.WriteToServer(reader)
                Catch ex As Exception
                    Console.WriteLine(ex.Message)
                Finally
                    reader.Close()
                End Try

            End Using
        End Using
        sourceConnection.Close()
    End Using

Risposta accettata

Nel sistema in cui eseguo BulkCopy, imposto i mapping delle colonne come spiegato nella documentazione Mappatura colonne - SQL Bulk Copy

Il mapping è impostato con i nomi delle colonne di origine e destinazione. Questo esempio proviene dalla documentazione:

 Dim mapID As New _
              SqlBulkCopyColumnMapping("ProductID", "ProdID")
            bulkCopy.ColumnMappings.Add(mapID)

Quando la configurazione viene avviata, ricordo di aver avuto problemi senza impostare esplicitamente i mapping delle colonne nel mio ambiente.


Risposta popolare

Se i tipi di campo, gli ordini di campo e il conteggio dei campi dell'origine dati, non sono gli stessi con la tabella di destinazione. Il tuo bulkcopy tornerà fallito.

Nel caso precedente, è necessario specificare le ColumnMappings di ciascun campo nel proprio datasuruce sull'oggetto sqlbulkcopy.

            SqlBulkCopy copy = new SqlBulkCopy(MySqlConn);
            copy.BulkCopyTimeout = 6000;
            copy.DestinationTableName = TableName;
            for (int i = 0; i < this.lstBulkFields.Count; i++) {
                // if the source fields name are the same with the targets.
                copy.ColumnMappings.Add(this.lstBulkFields[i], this.lstBulkFields[i]);
            }
            copy.BatchSize = BatchSize;
            copy.WriteToServer(MyDataSource);


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché