Excel à SQL. Alternative à BulkCopy?

c# sql sqlbulkcopy

Question

J'ai un morceau de code qui copie les données d'un tableur Excel dans une table MSSQL à l'aide de DataReader et de SqlBulkCopy. Cela a bien fonctionné jusqu'à ce que je crée une clé primaire sur la table et maintenant cela échoue. Je supprime d'abord le contenu de la table SQL avant de la remplir à nouveau avec les données Excel.

Comme il ne s'agit que d'une petite quantité de données que je déplace, je me suis demandé s'il existait un meilleur moyen de le faire que d'utiliser BulkCopy.

Mise à jour: le code relatif est indiqué ci-dessous et l'erreur que je reçois est la suivante: "La valeur donnée de type String de la source de données ne peut pas être convertie en type float de la colonne cible spécifiée."

using (OleDbConnection connection = new OleDbConnection(excelConnectionString))
            {
                connection.Open();
                OleDbCommand cmd = new OleDbCommand
                ("SELECT Name, Date, Amount FROM ExcelNamedRange", connection);

                using (OleDbDataReader dr = cmd.ExecuteReader())
                {
                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
                    {
                        bulkCopy.DestinationTableName = "SqlTable";
                        bulkCopy.WriteToServer(dr);

                    }
                }                 
            }

Réponse acceptée

SqlBulkCopy mappe automatiquement les champs. Mais depuis que vous avez ajouté une clé primaire, ce mappage par défaut n'est plus valide.

Vous devrez définir ColumnMapping pour indiquer clairement à votre objet SqlBulkCopy comment mapper les champs.

Faites cela pour tous vos champs, à l'exception de la clé primaire (en supposant que vous utilisez une identité sur la PK).

Par exemple:

_bulkCopyEngine.ColumnMappings.Add("fieldname_from", "fieldname_to");

Réponse populaire

La création d'une clé primaire suggère que vous appliquez une contrainte de domaine (une bonne chose).

Par conséquent, votre problème réel n'est pas que vous ayez besoin d'une autre façon d'effectuer l'insertion en bloc, mais que vous ayez besoin de savoir pourquoi vous avez des clés en double (raison précise de l'application de la PK).



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