FAQ DelphiConsultez toutes les FAQ
Nombre d'auteurs : 124, nombre de questions : 934, dernière mise à jour : 23 octobre 2024 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).
Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.
L'équipe Delphi de Developpez.com.
- Comment ouvrir une base Access en utilisant ADO ?
- Comment ouvrir une base Access en utilisant BDE + ODBC ?
- Comment ouvrir une base Access en utilisant les composants KADAO ?
- Comment créer une base Access vide sans qu'Access soit installé sur ma station ?
- Comment compacter une base Access ?
- Est-il nécessaire d'installer Access pour utiliser ses bases de données ?
- Comment charger directement un fichier CSV dans une table Access ?
Connexion a la base Pour ouvrir la base, placer un composant ADOConnection sur la fiche. Puis effectuer un clic droit sur le composant et choisir "Modifier la chaîne de connexion".
Cliquer ensuite sur le bouton construire pour utiliser l'assistant.
Sélectionner le fournisseur : "Microsoft Jet 4.0 OLE DB Driver" et cliquer sur suivant. Entrer alors le chemin d'accès à la base ainsi que le nom d'utilisateur et son mot de passe. Valider la chaîne.
Mettre enfin ADOConnection1.LoginPrompt à False.
Pour activer la connexion faire ADOConnection1.Open à l'exécution ou mettre ADOConnection1.Connected à True en conception.
Ouverture d'une table
Il suffit de placer un composant ADOQuery sur la fiche et de mettre :
- Connexion : ADOConnection1
- SQL : mettre une requête SELECT simple (SELECT * FROM UneTable)
Pour ouvrir la table faire ADOQuery1.Open à l'exécution ou mettre ADOQuery1.Active à True en conception.
Afficher la grille
Pour afficher la grille la méthode est ensuite standard, il suffit de mettre un DataSource sur la fiche et le relier à ADOQuery1. Puis une grille reliée à DataSource1.
Cette connexion suppose que les composants d'accès aux données de Microsoft sont installés sur l'ordinateur.
Définition d'un source ODBC
Aller dans le panneau de configuration et lancer ODBC Data Source.
Dans l'onglet User DSN cliquer sur Ajouter puis sélectionner le driver Microsoft Access Driver (*.mdb). Donner un nom à la source de donnée, ce nom sera automatiquement reconnu comme nom d'alias dans le BDE. Sélectionner la base servant de source de donnée à l'aide du bouton Sélectionner.... Puis valider.
Le nouvel alias doit apparaître dans l'administrateur BDE. Il et possible de tester la connexion en double-cliquant sur l'alias. La fenêtre de login apparaît et si la connexion est réussie, l'icône à gauche de l'alias doit être entourée de vert.
Connexion de l'application
Le plus simple est d'utiliser un composant TDataBase pour réaliser et gérer la connexion.
- Mettre dans DataBaseName le nom de l'alias créé précédemment
- Mettre LoginPrompt à false
- Ajouter deux paramètres dans params "USER NAME" avec le nom de l'utilisateur défini dans Interbase. "PASSWORD" avec le mot de passe associé
Il suffit ensuite de faire DataBase1.Open pour ouvrir la base Access.
Ouverture d'une table
Les tables sont ensuite ouvertes de façon classique. la propriété DataBaseName des composants utilisés doit contenir le nom de l'alias créé plus haut.
Cette connexion suppose que les composants d'accès aux données de Microsoft sont installés sur l'ordinateur.
Les composants KADAO sont une suite de composants encapsulant le moteur jet de Microsoft. Il permettent d'ouvrir des bases Access 97 et Access 2000.
Ces composants sont téléchargeable gratuitement à l'adresse http://kadao.dir.bg/. Deux versions sont disponibles dont une est utilisable avec la version perso de Delphi. Dans le cas d'une utilisation avec Delphi pro ou supérieur il vaut mieux télécharger le version correspondante, car les composants ont les mêmes ancêtres que les autres composants BDD. Ils sont ainsi compatibles avec les composants d'accès aux données contenus dans Delphi.
Connexion de l'application Utiliser un composant TKaDaoDataBase pour réaliser et gérer la connexion.
- Mettre dans DataBase le nom du fichier *.mdb
Il suffit ensuite de faire KaoDataBase1.Open pour ouvrir la base Access.
Ouverture d'une table
Placer un composant KaDaoTable sur la fiche et de mettre :
- DataBase : KaDaoDataBase1
- SQL : mettre une requête SELECT simple ( SELECT * FROM UneTable )
- DataBaseAutoActivate : mettre à True. Ce n'est pas obligatoire mais cela permet d'obtenir le même comportement que les autres méthodes de la FAQ.
Pour ouvrir la table faire KaDaoTable1.Open à l'exécution ou mettre KaDaoTable1.Active à True en conception.
Note : Le composant de type Table et de type Requête sont représentés par le même composant dans KaDao.
Cette connexion suppose que les composants d'accès aux données de Microsoft sont installés sur l'ordinateur.
Si vous ne disposez pas du logiciel Access sur votre station et que vous désirez créer une nouvelle base Access (mdb), il vous suffit d'utiliser OLE.
Le fonction suivante attend en entrée le nom du fichier mdb. Si une exception est levée alors la fonction AccessDatabaseCreator renvoit un message d'erreur.
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | uses comobj,sysutils; function AccessDatabaseCreator(_FileName : String) : String; var catalog : OLEVariant; begin result := ''; try catalog := CreateOleObject('ADOX.Catalog'); catalog.create ('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+_Filename+';'); catalog := NULL; except on e : Exception do result := e.message; end; end; |
En utilisant "Jet and Replication Objects" (JRO pour les intimes). JRO est une interface d'automation (OLE) qui permet d'effectuer des actions de maintenance sur des bases JET.
La fonction suivante permet de :
- faire un backup de la base de données Access (le nom du backup sera NomBDD.mdb.bak)
- compacter la base de données
Vous devez fournir en paramètres le chemin complet vers la base de données (ex : 'D:\Prog\MaBase.mdb') et le mot de passe de la base (si la base n'as pas de mot de passe, une simple chaîne vide convient).
La fonction renvoie un boolean à True, si toutes les actions se sont correctement déroulées, à False dans les autres cas.
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | function CompactAccessDB(DB, MdP : string): Boolean; {DB = path complet de la base Access, MdP = password de la DB } // Ajouter ComObj dans les Uses var v: OLEvariant; begin Result := False; try v := CreateOLEObject('JRO.JetEngine'); try if CopyFile(PAnsiChar(DB),PAnsiChar(DB+'.bak'),False) then //backup de la base begin V.CompactDatabase('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+DB+';Jet OLEDB:Database Password='+MdP, 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+DB+'comp'+';Jet OLEDB:Database Password='+MdP); //compactage DeleteFile(DB);// suppression de la base d'origin RenameFile(DB+'comp',DB); // mise en place de la base compactée Result := True; end; finally V := Unassigned; end; except Result := False; end; end; |
Lien Microsoft : How To Compact Microsoft Access Database Through ADO
Non, son installation n'est pas nécessaire.
En revanche, vous devrez installer ou mettre à jour les composants logiciels MDAC (Microsoft Data Access Componant) ainsi que le Jet Engine et ce, sur les postes devant manipuler votre base Access.
Pour les versions de Windows (2k/Xp/2003) disposant de "Microsoft Update" les mises à jour de ces composants se font automatiquement.
Ces composants sont disponibles au téléchargement sur le site de Microsoft
Pour ce faire, on utilisera une chaîne de connexion utilisant le paramètre Extended properties :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 | const ///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"'; ... //Appel MyADOConnection.ConnectionString :=Format(cstADOCsvConnexion,[ANomFichierCSV]); |
Code delphi : | Sélectionner tout |
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 | {*------------------------------------------------------------------------------ Crée un fichier Schema.ini pour l'usage sous ADO d'un fichier CSV utilisant un séparateur hors des standard ADO. @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; |
Le traitement utilise la même chaîne de connexion donnée précédemment :
Code delphi : | Sélectionner tout |
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 dû par exemple à un champ contenant une chaîne 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 // Gestion du délimiteur ';' CreerSchemaIni(PathFichierCSV, NomFichierCSV,cstDefautSeparateurChamp); //"Ouvre" le fichier csv MyADOConnection.ConnectionString :=Format(cstADOCsvConnexion,[PathFichierCSV]); // Ajoute les lignes d'un fichier CSV directement dans la table With dmPrincipal do // Avec dmPrincipal= class(TDataModule) begin // TADOConnection ADOCntCSV.Execute(Format(Requete,[NomTable, IncludeTrailingPathDelimiter(PathFichierCSV)+ cstNomBase, NomFichierCSV])); end; finally with dmPrincipal do ADOCntCSV.Close; end; end; |
Code sql : | Sélectionner tout |
INSERT INTO [Clients] IN "c:\appli\base\base.mdb" SELECT * FROM NouveauxClients.csv
Dans ce cas, on ne peut pas avoir le détail du premier champ fautif.
Il est possible d'utiliser un dataset avec le fichier CSV :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 | cstTxtQryCSV='Select * From %s'; ... CreerSchemaIni(PathFichierCSV, NomFichierCSV,cstDefautSeparateurChamp); OpenCSV(PathFichierCSV); ADODtsCSV.CommandText:=Format(cstTxtQryCSV,[NomFichierCSV]); ADODtsCSV.Active := True; |
Code delphi : | Sélectionner tout |
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 | {*------------------------------------------------------------------------------ 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 TdmPrincipal.OpenCSV(APathCSV : TFileName); // Les champs entourés avec des "" sont filtrés, i.e. débarassés des " begin //avec ADOCntCSV : TADOConnection; OpenCntADO(ADOCntCSV,cstADOCsvConnexion,APathCSV); end; {*------------------------------------------------------------------------------ Exécute une connexion ADO. La connexion est fermée 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 TdmPrincipal.OpenCntADO(ADOCnt : TADOConnection;CntString : String; ANomFichier: TFileName); begin Assert(ANomFichier <> EMPTY_STRING,'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; |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.