Utilisation de SqlBulkCopy pour l'insertion dans SQL

sqlbulkcopy sql-server vb.net

Question

Je ne sais pas pourquoi les données n'entrent pas dans SQL. Quelqu'un peut-il s'il vous plaît examiner cela et voir ce qui ne va pas avec mon code? J'ai obtenu la plupart du code ci-dessous et une page 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

Réponse acceptée

Dans le système sur lequel je fais une BulkCopy, j'ai configuré les mappages de colonnes comme expliqué dans la documentation Mappage de colonnes - Copie en bloc SQL

Le mappage est configuré avec les noms de colonne source et cible. Cet exemple provient de la documentation:

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

Lorsque je l'ai configuré pour la première fois, je me souviens d'avoir eu des problèmes sans configurer explicitement les mappages de colonnes dans mon environnement.


Réponse populaire

Si les types de champs, les ordres de champs et le nombre de champs de votre source de données ne sont pas identiques à la table de destination. Votre copie en bloc échouera.

Dans le cas ci-dessus, vous devez spécifier les objets ColumnMappings de chaque champ de votre datasoruce sur votre objet 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);


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi