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.
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.
Tutoriels Delphi Win32/Delphi .NET/Oracle/PowerShell - FAQ Delphi - FAQ Delphi .NET
Beatus, qui prodest, quibus potest.
Bonsoir Laurent,
ceci peut peut être t'aider.
A +,
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 ?
Tutoriels Delphi Win32/Delphi .NET/Oracle/PowerShell - FAQ Delphi - FAQ Delphi .NET
Beatus, qui prodest, quibus potest.
Désolé, rien de tel sous Access à ma connaissance.
Bonjour,Envoyé par Frank
Essayez ceci:
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
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.
Cordialement,
Hauwke
Salut,
merci pour vos réponses.
Oui ça j'ai déjà trouvé :Envoyé par Hauwke
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 ///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"';
Bon j'aurais bien vu une méthode SetString pour l'objet table
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;
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
Tutoriels Delphi Win32/Delphi .NET/Oracle/PowerShell - FAQ Delphi - FAQ Delphi .NET
Beatus, qui prodest, quibus potest.
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) :
Le code est à vérifier car je l'ai rapidement adapté. La requête donne qq chose comme :
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;
'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
Il est possible d'utiliser un dataset avec 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
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;
cstTxtQryCSV='Select * From %s';
...
CreerSchemaIni(PathFichierCSV, NomFichierCSV,cstDefautSeparateurChamp);
OpenCSV(PathFichierCSV);
ADODtsCSV.CommandText:=Format(cstTxtQryCSV,[NomFichierCSV]);
ADODtsCSV.Active := True;
Tutoriels Delphi Win32/Delphi .NET/Oracle/PowerShell - FAQ Delphi - FAQ Delphi .NET
Beatus, qui prodest, quibus potest.
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"
tmp= chemin de base de données+ nom de la base
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;
NomFichierCSV=chemin du répertoire du fichier csv
merci d'avance
[Il était une fois Delphi ....]
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 ....]
Salut,
Peux-tu nous communiquer les noms complet de tmp et de NomFichierCSV ?Envoyé par zemeilleurofgreg
Verifie si le fichier n'est pas en r/o ou utilisé par un autre process.Envoyé par zemeilleurofgreg
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.
Tutoriels Delphi Win32/Delphi .NET/Oracle/PowerShell - FAQ Delphi - FAQ Delphi .NET
Beatus, qui prodest, quibus potest.
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."
voici maintenant la chaine de connection :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ADOcsv.Execute(Format(Requete,['Q_Zmir0678', IncludeTrailingPathDelimiter(tmp), NomFichierCSV]));
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 ....]
Envoyé par zemeilleurofgregPuisque j'utilise le type TFileName vérifie si c'est le chemin complet du fichier .csv qui ne doit pas contenir d'espace.Envoyé par Laurent Dardenne
Tutoriels Delphi Win32/Delphi .NET/Oracle/PowerShell - FAQ Delphi - FAQ Delphi .NET
Beatus, qui prodest, quibus potest.
La variable "NomFichierCSV" contient le chemin complet du répertoire ou se trouve le fichier tmp.csv (sans le nom du fichier).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 "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 ....]
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 :faut-il modifier un paramètre de l'objet TADOConnection ?
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 ....]
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager