IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

SQL Insert Into Access


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut SQL Insert Into Access
    Bonjour,

    Je bloque sur la manière de laquelle importer un fichier texte dans un tableau Access (.accdb).

    Dans un premier temps je récupère les informations sur le fichier texte (nombre de colonnes et nombre de lignes).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string[] allFileLines = File.ReadAllLines(fileLocation);
    int fileLines = allFileLines.Length;
    int fileColumns = allFileLines[0].Split('\t').Length;
    Ensuite je crée une table dans ma base Access pour y importer le fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dbCommand.CommandText = "CREATE TABLE " + tblName;
    dbConnection.Open();
    dbCommand.ExecuteNonQuery();
    Le tableau étant vide j'y écris l’entête du fichier texte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int fileColumnName = 0; fileColumnName < fileColumns; fileColumnName++)
    {
      dbCommand.CommandText = "ALTER TABLE " + tblName + " ADD COLUMN " + fileHeader[fileColumnName] + " TEXT(255)";
      dbCommand.ExecuteNonQuery();
    }
    Je définie ensuite 3 string contenant chacun les informations pour ma requête SQL.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for (int fieldImportLoop = 0; fieldImportLoop < fileColumns; fieldImportLoop++)
    {
      importFieldName[fieldImportLoop] = "[" + fileHeader[fieldImportLoop] + "]";
      fieldNames = fieldNames + ", " + importFieldName[fieldImportLoop];
      importFieldValue[fieldImportLoop] = "@" + fileHeader[fieldImportLoop];
      fieldValues = fieldValues + ", " + importFieldValue[fieldImportLoop];
      realFieldValue[fieldImportLoop] = '\u0022' + fileLinesSplit[fieldImportLoop] + '\u0022';
      realValues = realValues + ", " + realFieldValue[fieldImportLoop];
    }          
     
    fieldNames = "(" + fieldNames.Substring(2) + ")";
    fieldValues = "(" + fieldValues.Substring(2) + ")";
    realValues = realValues.Substring(2);
    Ce qui donne quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fieldNames => ([SOCIETE], [CIV], [NOM], etc...)
    fieldValues => (@SOCIETE, @CIV, @NOM, etc...)
    realValues => "ENTREPRISE MACHIN", "MONSIEUR", "MACHIN", etc...
    Maintenant je souhaiterais importer ligne par ligne mon fichier texte dans ma base Access dans mon tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string dbCommandString = "INSERT INTO [" + tblName + "]" + fieldNames + " VALUES " + fieldValues;
    C'est maintenant que j'ai un problème, sachant que mes fichiers n'ont jamais la même structure càd nombre de colonnes comment je peux procéder pour avoir un "Parameters.addWithValue" dynamique ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbCommand.Parameters.AddWithValue("@Champ1", "ValeurCamp1");
    En théorie faudrait que j'écrive une ligne comme au dessus par Champ.

    Si quelqu'un pourrait me donner une astuce de comment faire, ça serait super sympas.

    CrazyNoun

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    de la même manière que tu parcours tes noms de colonne pour construire ta requête tu peux créer tes paramètres (sans leur donner de valeur, donc Add() et pas AddWithValue()), en conservant des références vers ceux-ci. Ensuite lorsque tu parcours tes lignes pour faire tes INSERT tu les parcours pour les valoriser. D'ailleurs tes bouts de code 3 et 4 font cette même boucle, tu pourrais les fusionner pour ne faire qu'une fois le parcours.

    Enfin je ne vois pas de contrainte particulière pour ton nombre de colonnes variable entre chaque fichier vu que tu sembles créer une table à chaque fois.

    Bon dev.
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci pour ta réponse. Du coup j'ai abordé mon problème avec un array de "OleDbParameter" que je souhaite ensuite exécuter avec "Parameters.AddRange".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    OleDbParameter[] importParameter = new OleDbParameter[fileColumns];
     
    OleDbConnection queryConnection = new OleDbConnection(dbConnectionString);
                    OleDbCommand queryCommand = new OleDbCommand();
                    queryCommand.Connection = queryConnection;
     
                    for (int importColumnLoop = 0; importColumnLoop < fileColumns; importColumnLoop++)
                    {
                        OleDbParameter queryParameter = new OleDbParameter();
                        queryParameter = queryCommand.Parameters.Add('\u0022' + importFieldValue[importColumnLoop] + '\u0022', OleDbType.VarChar, 255, realFieldValue[importColumnLoop]);
                        importParameter[importColumnLoop] = queryParameter;                         
                    }
     
                    queryCommand.Parameters.Clear();
                    string queryCommandString = "INSERT INTO [TBL_ImportFileTest] " + fieldNames + " VALUES " + fieldValues;
                    queryCommand.CommandText = queryCommandString;
                    queryCommand.Parameters.AddRange(importParameter);
     
                    queryConnection.Open();
                    queryCommand.ExecuteNonQuery();
                    queryConnection.Close();
    J'ai une erreur me disant "L'élément OleDbParameter est déjà contenu dans un autre OleDbParameterCollection."
    Je pensais résoudre le problème avec la ligne "queryCommand.Parameters.Clear();"
    Nouveau problème "Le paramètre @SOCIETE n'a pas de valeur par défaut." càd mon premier champ à importer.
    Du Coup je suis une nouvelle fois bloqué par mon manque de connaissances.
    Si quelqu’un pourrait me donner une astuce, merci d'avance.

    CrazyNoun

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Re,

    ta première erreur est simple : dans ta boucle tu ajoutes tes paramètres à ta commande puis à la sortie tu tentes de tous les réinjecter, du coup ça fait doublon. Supprimer avec Clear() solutionne le problème mais c'est un peu idiot, autant ne pas injecter tes paramètres deux fois.

    Pour le deuxième souci, d'après le texte de l'erreur, tu n'as pas valorisé ton paramètre avant de faire ta requête d'insertion. Et dans ton code on voit en effet que tu appelles ExecuteNonQuery sans avoir mis de donnée dans tes paramètres.

    Pour résumer l'algo que tu dois mettre en place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // pour chaque colonne de ma première ligne (entêtes)
    	// je concatène le nom à ma chaine des noms de colonnes
    	// je concatène le nom à ma chaine des noms de paramètres
    	// j'ajoute le OleDbParameter correspondant dans ma OleDbCommand
     
    // je concatène mes chaines pour faire une requête d'insertion que j'associe à ma OleDbCommand
     
    // pour chaque ligne de donnée (hors première ligne donc)
    	// pour chaque colonne
    		// je valorise le OleDbParameter[numero de colonne] de ma OleDbCommand avec la valeur lue
    	// j'exécute la requête d'insertion
    Plus je connais de langages, plus j'aime le C.

Discussions similaires

  1. [ACCESS] Bouton Requete SQL INSERT INTO
    Par harry le ravi dans le forum VBA Access
    Réponses: 8
    Dernier message: 28/06/2008, 22h33
  2. Pb d'écriture intempestive dans table avec SQL insert into
    Par pete_shifter dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/11/2005, 11h51
  3. Réponses: 2
    Dernier message: 30/09/2005, 15h41
  4. Multiplier les And dans Sql Insert Into
    Par samlepiratepaddy dans le forum Requêtes et SQL.
    Réponses: 17
    Dernier message: 23/09/2005, 21h55
  5. erreur SQL ...INSERT INTO
    Par naidinp dans le forum ASP
    Réponses: 20
    Dernier message: 18/09/2003, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo