SQLBulkCopy: Le nombre de colonnes fait-il une différence?

sqlbulkcopy sql-server

Question

J'essaie de chercher mais je n'ai pas trouvé de réponse à une chose relativement simple. J'ai un fichier CSV, qui n'a pas toute la colonne comme dans ma table de base de données, de même qu'il manque l'incrémentation automatique, clé primaire dans le fichier CSV.

Tout ce que j'ai fait est de lire le fichier CSV dans le DataSet, puis d'exécuter un code SQLBulkCopy traditionnel pour lire le premier tableau du jeu de données dans la table de base de données. Mais cela me donne l'erreur suivante:

The given ColumnMapping does not match up with any column in the source or destination.

Mon code pour bulkcopy est

using (SqlBulkCopy blkcopy = new SqlBulkCopy(DBUtility.ConnectionString))
{

    blkcopy.EnableStreaming = true;
    blkcopy.DestinationTableName = "Project_" + this.ProjectID.ToString() + "_Data";
    blkcopy.BatchSize = 100;
    foreach (DataColumn c in ds.Tables[0].Columns)
    {
        blkcopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);
    }

    blkcopy.WriteToServer(ds.Tables[0]);
    blkcopy.Close();
}

J'ajoute Mapping à tester, mais cela ne fait aucune différence d'enlever une partie du mapping. Si nous supprimons le mappage essayant de faire correspondre les colonnes dans l'ordre et puisque les nombres sont différents, ils finissent par correspondre au type de données, aux valeurs de colonnes inférieures, etc.

EDIT: Je modifie le code de mappage pour comparer le nom de colonne de Live DB. Pour cela, je lance simplement une requête SQL Select pour extraire un enregistrement de la table de base de données, puis je fais

foreach (DataColumn c in ds.Tables[0].Columns)
{
    if (LiveDT.Columns.Contains(c.ColumnName))
    {
        blkcopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);
    }
    else
    {
        log.WriteLine(c.ColumnName + " doesn't exists in final table");
    }
}

Réponse acceptée

Je voudrais vider les résultats de CSV dans une table SQL intermédiaire ... puis faire une simple insertion de la table intermédiaire dans la table de production.

faites aussi une simple importation de CSV dans une table SQL, peut-être y at-il des colonnes vides / invalides dans un fichier CSV.


Réponse populaire

Une fois, j'ai eu ce problème et la cause était une différence dans le cas des noms de colonne. Une des colonnes était "Id" , mais dans la base de données, c'était "id" .



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