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

Bases de données Delphi Discussion :

[ADO][Access] Chargement d'un csv dans une table


Sujet :

Bases de données Delphi

  1. #1
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut [ADO][Access] Chargement d'un csv dans une table
    Salut,
    j'aimerais savoir si ADO permet de charger un fichier csv directement dans une table ACCESS, à l'identique de l'instruction VBA DoCmd.TransferText ?
    Merci.

  2. #2
    Membre expérimenté
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Points : 1 392
    Points
    1 392
    Par défaut
    Bonsoir Laurent,

    ceci peut peut être t'aider.

    A +,

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Merci Frank, j'avais déjà regardé ce post mais c'est l'import qui m'intéresse dans un premier temps .
    J'ai regardé sur MSDN mais cela demande pas mal de temps à consacrer à la recherche.
    Enfin je peux faire une itération sur 2 RecordSet
    Sais-tu s'il existe sous un Access un outil externe du type SqlLoader d'Oracle ?

  4. #4
    Membre expérimenté
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Points : 1 392
    Points
    1 392
    Par défaut
    Désolé, rien de tel sous Access à ma connaissance.

  5. #5
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut
    Citation Envoyé par Frank
    Désolé, rien de tel sous Access à ma connaissance.
    Bonjour,
    Essayez ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MACOnnection.connectionString := 'Provider; DATA SOURCE=Monchemin\monfichier.csv....// Mieux Monfichier.xls
    ...
    ....
    Extended Properties = 'Excel. 10.00' // la version d'excel installée sur votre machine.
    Extended properties de la propriété connection string renseigne l'objet "catalog" ADOX sur les propriétés supplémentaires qui lui font défauts en natif. Cette prorpiété permet de créer toute connection "non ADO" y compris pour des base ISAM
    Cordialement,
    Hauwke

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    merci pour vos réponses.
    Citation Envoyé par Hauwke
    Extended properties de la propriété connection string renseigne l'objet "catalog" ADOX sur les propriétés supplémentaires qui lui font défauts en natif. Cette prorpiété permet de créer toute connection "non ADO" y compris pour des base ISAM
    Oui ça j'ai déjà trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       ///Chaîne de connexion ADO à construire avec le nom du répertoire contenant le fichier CSV
      cstADOCsvConnexion='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties="text;HDR=YES;Format=Delimited"';
    En revanche pour les fichier utilisant le point virgule comme séparateur on doit créer un fichier Schema.ini dans le répertoire où se trouve le fichier csv :
    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
    22
    23
    24
    25
    26
     
    {*------------------------------------------------------------------------------
    Crée un fichier Schema.ini pour l'usage sous ADO d'un fichier CSV utilisant un séparateur hors des standard ADO. Voir Aussi : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcjetschema_ini_file.asp
      @param APath   Chemin où créer le fichier Schema.ini, qui doit être celui du fichier .csv et doit être en R/W
      @param AName   Nom du fichier csv concerné. Il est utilisé comme nom de section dans le fichier Schema.ini
      @Param ADelimiteur Délimiteur utilisé dans le fichier csv, généralement le caractère point virugule ';'.
    ------------------------------------------------------------------------------*}
    Procedure CreerSchemaIni(APath, ANameOnly: TFileName; const ADelimiteur: ShortString);
     {
    [MonFichier.CSV]
    Format = Delimited(;)
     }
     
    var
      SchemaIni: TIniFile;
    begin
    try
      SchemaIni:=Nil;
      SchemaIni:=TIniFile.Create(IncludeTrailingPathDelimiter(APath)+'Schema.ini');
      SchemaIni.WriteString(ANameOnly, 'Format', 'Delimited('+ADelimiteur+')');
     finally
      SchemaIni.Free;
     end;
    end;
     
    end;
    Bon j'aurais bien vu une méthode SetString pour l'objet table

    Pour info :
    Divers chaine de connexion : http://www.carlprothman.net/Default....CDriverForText
    Doc (Troubleshooting Data-Driven Unit Tests) : http://msdn2.microsoft.com/en-us/lib...00(VS.80).aspx
    Tuto : http://msdn.microsoft.com/library/de...ng03092004.asp
    Schema : http://msdn.microsoft.com/library/de...a_ini_file.asp

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Pour info c'est possible en ADO d'utiliser un csv comme une table (on utilise la même chaîne de connexion donnée précédement) :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    procedure TfrmImpExp.ImportDirectCVSToBase(PathFichierCSV, NomFichierCSV:TFileName);
    {
    Peut renvoyer l'exception EOleException : Type de données incompatible dans l'expression du critère
    Ceci est du par exemple à champ contenant une chaine au lieu d'un integer.
     
    Avec un DataSet l'erreur serait: '52SPP298' n'est pas une valeur entière correcte pour le champ 'IDPAYS'
    }
    const
         //NomTable NomPath+NomBase NomFichierText(sans le path)
        Requete='INSERT INTO [%s] IN "%s" SELECT * FROM %s';
     
    Var NomFichierCSV,
        PathFichierCSV : TFileName;
     
    begin
    try
      CreerSchemaIni(PathFichierCSV, NomFichierCSV,cstDefautSeparateurChamp); //gestion du délimiteur ';'
      OpenCSV(PathFichierCSV); //"Ouvre" le fichier csv
      //Ajoute les lignes d'un fichier CSV directement dans la table
      With dmPrincipal do
      begin
       //TADOConnection
       ADOCntCSV.Execute(Format(Requete,[NomTable,
                                         IncludeTrailingPathDelimiter(PathFichierCSV)+ cstNomBase,
                                         NomFichierCSV]));
      end;
     end;
    finally
      with dmPrincipal do
        ADOCntCSV.Close;
    end;
    end;
    Le code est à vérifier car je l'ai rapidement adapté. La requête donne qq chose comme :
    'INSERT INTO [Clients] IN "c:\appli\base\base.mdb" SELECT * FROM NouveauxClient.csv'.

    Le nom du fichier csv ne doit pas contenir de tiret '-' ni d'espace car ils sont interprété par lors du parsing SQL.
    Le fichier CSV doit contenir des données valides sinon la requête échoue (Type de données incompatible dans l'expression du critère).
    Dans ce cas on ne peut pas avoir le détail du premier champ fautif.

    code de connexion
    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
    22
    23
    24
    25
    26
    27
     
    {*------------------------------------------------------------------------------
    Se connecte à la pseudo table basée sur un fichier CSV
      @param APathCSV   Nom complet du fichier CSV pour un usage avec un DataSet ou le nom du répertoire pour un usage avec SQL
    ------------------------------------------------------------------------------*}
    procedure TdmPrincipale.OpenCSV(APathCSV : TFileName);
    // Les champs entourés avec des "" sont filtrés, i.e. débarassés des "
    begin
      OpenCntADO(ADOCntCSV,cstADOCsvConnexion,APathCSV);
    end;
     
    {*------------------------------------------------------------------------------
    Exécute une connexion ADO. La connexion est fermé avant d'être réouverte avec la nouvelle chaîne de connexion.
      @param ADOCnt   Connexion ADO concernée
      @param CntString   Chaîne de connexion ADO
      @param ANomFichier   Nom du fichier concerné (base Access ou fichier CSV)
    ------------------------------------------------------------------------------*}
    procedure TdmPrincipale.OpenCntADO(ADOCnt : TADOConnection;CntString : String; ANomFichier: TFileName);
    begin
     Assert(ANomFichier <> '','Tentative d''ouverture d''une connexion ADO avec un nom de fichier vide.');
     with ADOCnt do
     begin
       Close;
       ConnectionString :=Format(cntString,[ANomFichier]);
       Open;
     end;
    end;
    Il est possible d'utiliser un dataset avec le fichier CSV
    cstTxtQryCSV='Select * From %s';
    ...
    CreerSchemaIni(PathFichierCSV, NomFichierCSV,cstDefautSeparateurChamp);

    OpenCSV(PathFichierCSV);
    ADODtsCSV.CommandText:=Format(cstTxtQryCSV,[NomFichierCSV]);
    ADODtsCSV.Active := True;

  8. #8
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Bonjour,

    pourriez-vous me dire ce qui cloche dans mon code parce que j'ai un message d'erreur me disant que "le nom de fichier est incorect"

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    procedure TfrmMain.OpenCSV(APathCSV : TFileName);
    begin
      OpenCntADO(ADOcsv,cstADOCsvConnexion,APathCSV);
    end;
     
    procedure TfrmMain.OpenCntADO(ADOCnt : TADOConnection;CntString : String; ANomFichier: TFileName);
    begin
     Assert(ANomFichier <> '','Tentative d''ouverture d''une connexion ADO avec un nom de fichier vide.');
     with ADOCnt do
     begin
       Close;
       ConnectionString :=Format(cntString,[ANomFichier]);
       Open;
     end;
    end;
     
     
    procedure TfrmMain.ImportDirectCVSToBase(PathFichierCSV, NomFichierCSV:TFileName);
    const
    Requete='INSERT INTO [%s] IN "%s" SELECT * FROM %s';
    var
    cstADOCsvConnexion:string;
    begin
      try
      //Gestion du délimiteur ';'
      CreerSchemaIni(PathFichierCSV, NomFichierCSV,';');
      //"Ouvre" le fichier csv
      cstADOCsvConnexion:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties="text;HDR=YES;Format=Delimited"';
      OpenCSV(PathFichierCSV); //"Ouvre" le fichier csv
     
      showmessage(Format(Requete,['Q_Zmir0678',
                                         IncludeTrailingPathDelimiter(tmp),
                                         NomFichierCSV]));
     
      //Ajoute les lignes d'un fichier CSV directement dans la table
      ADOcsv.Execute(Format(Requete,['Q_Zmir0678',
                                         IncludeTrailingPathDelimiter(tmp),
                                         NomFichierCSV]));
      except
      on E:Exception do
      begin
        showmessage(E.Message);
      end;
      end;
    end;
    tmp= chemin de base de données+ nom de la base
    NomFichierCSV=chemin du répertoire du fichier csv


    merci d'avance
    [Il était une fois Delphi ....]


  9. #9
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    j'ai renomé mon fichier tmp.csv en tmp.xls et maintenant j'ai comme message d'erreur "impossible de mettre à jour, la base ou l'objet est en lecture seule" !!
    [Il était une fois Delphi ....]


  10. #10
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par zemeilleurofgreg
    j'ai un message d'erreur me disant que "le nom de fichier est incorect"
    Peux-tu nous communiquer les noms complet de tmp et de NomFichierCSV ?
    Citation Envoyé par zemeilleurofgreg
    "impossible de mettre à jour, la base ou l'objet est en lecture seule"
    Verifie si le fichier n'est pas en r/o ou utilisé par un autre process.
    Quel objet /appel produit cette erreur ?
    Comme cela date un peu mais je me souviens avoir utilisé un Datamodule, il se peut que j'ai oublié une info. Il me semble l'avoir proposé pour la FAQ vérifie s'il n'y pas plus d'info à ce sujet.

  11. #11
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Salut Laurent,

    tout d'abord je te remercie de ta réponse car ce sujet ne date pas d'hier !

    tmp=D:\Applications\Borland\Delphi7\Projects\DRP BDC\DATA\DRP Prologs OUT 17_11_2006.mdb (chemin de la base de données Access)

    NomFichierCSV=D:\Applications\Borland\Delphi7\Projects\DRP BDC\DATA\OUTPUT (chemin du répertoire du fichier xls (au format csv avec séparateur ";"))

    le répertoire OUTPUT contient le fichier Schema.ini ainsi que le fichier temp.xls

    voici le code qui produit l'erreur : "Mise à jour impossible. La base ou l'objet est en lecture seule."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     ADOcsv.Execute(Format(Requete,['Q_Zmir0678',
                                         IncludeTrailingPathDelimiter(tmp),
                                         NomFichierCSV]));
    voici maintenant la chaine de connection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cstADOCsvConnexion:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties="text;HDR=YES;Format=Delimited"';
    [Il était une fois Delphi ....]


  12. #12
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zemeilleurofgreg
    tmp=D:\Applications\Borland\Delphi7\Projects\DRP BDC\DATA\DRP Prologs OUT 17_11_2006.mdb (chemin de la base de données Access)
    Citation Envoyé par Laurent Dardenne
    Le nom du fichier csv ne doit pas contenir de tiret '-' ni d'espace car ils sont interprété par lors du parsing SQL.
    Puisque j'utilise le type TFileName vérifie si c'est le chemin complet du fichier .csv qui ne doit pas contenir d'espace.

  13. #13
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Puisque j'utilise le type TFileName vérifie si c'est le chemin complet du fichier .csv qui ne doit pas contenir d'espace.
    La variable "NomFichierCSV" contient le chemin complet du répertoire ou se trouve le fichier tmp.csv (sans le nom du fichier).

    La variable "tmp" contient le chemin complet de la base de données Access (avec le nom de la base)

    si j'utilise un fichier avec extension "csv" j'ai le message : nom de fichier incorrect.

    si j'utilise un fichier avec une extension "xls" mais au format "csv" j'ai le message : Mise à jour impossible. La base ou l'objet est en lecture seule.

    voici la requête exécutée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO [Q_Zmir0678] IN "D:\Applications\Borland\Delphi7\Projects\DRP BDC\DATA\DRP Prologs OUT 17_11_2006.mdb\" SELECT * FROM tmp.csv
    [Il était une fois Delphi ....]


  14. #14
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    voici le message d'erreur exact :

    CSVFile.csv n'est pas un chemin valide. Assurez-vous que le nom du chemin d'accès est correct et qu'une connexion est établie avec le serveur sur lequel réside le fichier.


    J'utilise l'objet TADOConnection.
    chaine de connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cstADOCsvConnexion:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties="text;HDR=YES;Format=Delimited"';
    faut-il modifier un paramètre de l'objet TADOConnection ?
    [Il était une fois Delphi ....]


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/04/2011, 15h26
  2. [AC-2003] Importer un Fichier Csv dans une table Access
    Par jmde dans le forum VBA Access
    Réponses: 6
    Dernier message: 03/01/2010, 12h35
  3. Injecter csv dans une table access avec VB6
    Par chefinf dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 03/02/2009, 22h05
  4. Importer un fichier CSV dans une table Access
    Par zemeilleurofgreg dans le forum Bases de données
    Réponses: 17
    Dernier message: 09/07/2008, 22h48

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