importer le fichier csv / excel dans la base de données sql asp.net

je commence un projet avec asp.net visual studio 2008 / SQL 2000 (2005 dans le futur) en utilisant c#.

la partie délicate pour moi est que le schéma de base de données existant change souvent et les colonnes d'importation de fichiers devront toutes être mises en correspondance avec le schéma de base de données existant car elles peuvent ne pas être une à une correspondance sur les noms de colonne. (Il y a une table de recherche qui fournit les tableaux de schéma avec des noms de colonne, je vais utiliser)

j'explore différentes façons d'aborder cette question, et j'ai besoin des conseils d'experts. Y a-t-il des contrôles ou des cadres existants que je peux utiliser pour faire tout cela?

Jusqu'à présent, j'ai exploré le contrôle FileUpload. net, ainsi que certains contrôles de téléchargement tiers pour accomplir le téléchargement tel que SlickUpload mais les fichiers téléchargés devraient être < 500mb

partie Suivante est la lecture de mon fichier csv /excel et l'analyse pour l'affichage à l'utilisateur, de sorte qu'ils peuvent correspondre avec notre db schéma. J'ai vu CSVReader et d'autres, mais pour excel c'est plus difficile car j'aurai besoin de supporter différentes versions.

essentiellement L'utilisateur effectuant cette importation insérera et/ou mettra à jour plusieurs tables à partir de ce fichier d'importation. Il y a d'autres exigences plus avancées comme l'appariement des enregistrements mais et l'aperçu des enregistrements d'importation, mais je souhaite obtenir à travers comprendre comment faire cela d'abord.

mise à jour: j'ai fini par utiliser csvReader avec LumenWorks.Cadre pour le téléchargement des fichiers csv.

10
demandé sur Curt 2009-01-29 01:07:52

5 réponses

consultez l'excellente bibliothèque FileHelpers-là un l'article sur CodeProject à ce sujet, et il est hébergé ici.

C'est de la pure C#, et il peut importer peu près n'importe quel plat de fichier, CSV, et il traite avec Excel, trop. L'importation est totalement configurable: vous pouvez définir des choses comme les séparateurs de lignes et/ou colonnes pour sauter, et ainsi de suite - beaucoup d'options.

j'ai utilisé avec succès dans divers projets et il fonctionne parfaitement - très recommandé.

8
répondu marc_s 2011-12-10 00:28:12

vous pouvez facilement créer un IDataReader sur un fichier Excel ou CSV (voir http://support.microsoft.com/kb/316934).

utilisez-vous SQL Server comme moteur de base de données? Si c'est le cas, vous pouvez utiliser la classe SqlBulkCopy (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx) pour prendre efficacement votre IDataReader, les colonnes de mappage selon le cas, et stocker les résultats dans votre base de données.

5
répondu Antony Perkov 2009-01-29 01:57:13

je soupçonne qu'il existe peut-être des outils robustes et flexibles pour vous aider avec cette application potentiellement très complexe que, espérons-le, quelqu'un vous indiquera.

En attendant, voici une fonction que j'ai trouvé utile pour convertir un fichier excel pour une DataTable. Cette version ne cherche que la première feuille de travail. Il pourrait servir de point de départ. To à quelque chose de similaire avec les fichiers csv ne devrait nécessiter que la modification de la chaîne de connexion.

public static DataTable GetDataTableFromExcel(string SourceFilePath)
{
    string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                                "Data Source=" + SourceFilePath + ";" +
                                "Extended Properties=Excel 8.0;";

    using (OleDbConnection cn = new OleDbConnection(ConnectionString))
    {
        cn.Open();

        DataTable dbSchema = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        if (dbSchema == null || dbSchema.Rows.Count < 1)
        {
            throw new Exception("Error: Could not determine the name of the first worksheet.");
        }

        string WorkSheetName = dbSchema.Rows[0]["TABLE_NAME"].ToString();

        OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [" + WorkSheetName + "]", cn);
        DataTable dt = new DataTable(WorkSheetName);

        da.Fill(dt);

        return dt;
    }
}
3
répondu HectorMac 2009-01-29 02:11:49

FileHelpers est votre ami. J'ai utilisé avec bonheur, pour plusieurs projets et il m'a sauvé beaucoup de chagrin et de travail

1
répondu Rad 2009-01-29 06:51:22

j'utilise csvReader de LumenWorks.Cadre pour télécharger et importer les fichiers csv dans une table sql et une DataTable en mémoire que je crée sur la base des colonnes importées.

j'ai aussi l'utilisateur mapper les champs dans l'interface utilisateur et procéder à valider et préparer les données pour l'importation en étiquetant chaque enregistrement comme insert/update/error. Je crée alors/peupler fortement l'ensemble de données dactylographiées pour chaque table qui sera affectée et construire les requêtes insert / update pour la bibliothèque D'entreprise Méthode updateataset ().

puis je soumets le mouvement pour insérer / mettre à jour la base de données. –

La cartographie est une grille avec 4 colonnes. (importer le nom du champ, la table de destination, le nom du champ de destination, l'ignorer, l'état de match), avec la table de destination et les noms de champ étant sélectionne qui rafraîchissent basé sur la table sélectionnée. J'remplir dynamiquement le sélectionne. Initialement sélectionner combo est rempli avec 1 valeur si la correspondance est trouvée, ou s'il vous plaît sélectionner si elle n'est pas. ignorer permet à l'utilisateur de ignorer le champ. l'état de match est si un champ a été auto-mappé

1
répondu kiev 2010-10-05 19:39:20