1. Utiliser la base de données d'accès dans DELPHI (créer un fichier .mdb, compresser la base de données)
Le code suivant a réussi le test sous WIN2K, D6, MDAC2.6,
Le programme compilé s'exécute avec succès dans la deuxième version de WIN98 sans environnement ACCESS.
//Avant d'utiliser ComObj,ActiveX
//Déclare la chaîne de connexion
Const
SConnectionString = 'PRvider=Microsoft.Jet.OLEDB.4.0;Source de données=%s;'
+'Jet OLEDB:Mot de passe de la base de données=%s;';
//================================================= =============================
// Procédure : GetTempPathFileName
// Auteur : ysai
// Date : 2003-01-27
// Arguments : (Aucun)
// Résultat : chaîne
//================================================= =============================
fonction GetTempPathFileName():string;
//Obtenir le nom du fichier temporaire
var
SPath,SFile : tableau [0..254] de caractères ;
commencer
GetTempPath(254,SPath);
GetTempFileName(SPath,'~SM',0,SFile);
résultat :=SFichier ;
Supprimer le fichier (PChar (résultat));
fin;
//================================================= =============================
// Procédure : CreateAccessFile
// Auteur : ysai
// Date : 2003-01-27
// Arguments : NomFichier : Chaîne ; Mot de passe : chaîne = ''
// Résultat : booléen
//================================================= =============================
function CreateAccessFile(FileName:String;PassWord:string=''):boolean;
//Créer un fichier Access, échouer si le fichier existe
var
STempFileName : chaîne ;
vCatalogue : OleVariant ;
commencer
STempFileName :=GetTempPathFileName ;
essayer
vCatalog:=CreateOleObject('ADOX.Catalog');
vCatalog.Create(format(SConnectionString,[STempFileName,PassWord]));
result:=CopyFile(PChar(STempFileName),PChar(FileName),True);
Supprimer le fichier (STempFileName);
sauf
résultat :=faux ;
fin;
fin;
//================================================= =============================
// Procédure : CompactDatabase
// Auteur : ysai
// Date : 2003-01-27
// Arguments : AFileName, APassWord : chaîne
// Résultat : booléen
//================================================= =============================
fonction CompactDatabase(AFileName,APassWord:string):boolean;
// Compresser et réparer la base de données, écraser les fichiers sources
var
STempFileName : chaîne ;
vJE:OleVariant;
commencer
STempFileName :=GetTempPathFileName ;
essayer
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
format(SConnectionString,[STempFileName,APassWord]));
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
Supprimer le fichier (STempFileName);
sauf
résultat :=faux ;
fin;
fin;
//================================================= =============================
// Procédure : ChangeDatabasePassword
// Auteur : ysai
// Date : 2003-01-27
// Arguments : AFileName, AOldPassWord, ANewPassWord : chaîne
// Résultat : booléen
//================================================= =============================
fonction ChangeDatabasePassword(AFileName,AOldPassWord,ANewPassWord:string):boolean;
//Modifier le mot de passe de la base de données ACCESS
var
STempFileName : chaîne ;
vJE:OleVariant;
commencer
STempFileName :=GetTempPathFileName ;
essayer
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(format(SConnectionString,[AFileName,AOldPassWord]),
format(SConnectionString,[STempFileName,ANewPassWord]));
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
Supprimer le fichier (STempFileName);
sauf
résultat :=faux ;
fin;
fin;
2. Éléments auxquels vous devez prêter attention et quelques conseils lors de l'utilisation d'instructions SQL dans ACCESS
L'instruction SQL suivante a transmis la requête dans ACCESS XP
Créer un tableau :
Créer un tableau Tab1 (
Compteur d'identification,
Chaîne de nom,
Âge entier,
[Date] DateHeure);
Compétence:
Les champs à incrémentation automatique sont déclarés avec Counter.
Les champs dont les noms de champ sont des mots-clés sont placés entre crochets [] et les nombres sont également acceptables comme noms de champ.
Créer un index :
L'instruction suivante crée un index répétable sur la colonne Date de Tab1
Créer un index iDate ON Tab1 ([Date]);
Une fois terminé, l'attribut d'index de date du champ dans ACCESS s'affiche comme - Oui (duplicata).
L'instruction suivante crée un index non répétable sur la colonne Nom de Tab1
Créer un index unique iName ON Tab1 (Nom);
Une fois terminé, l'attribut d'index du champ Nom dans ACCESS s'affiche comme - Oui (pas de duplication).
L'instruction suivante supprime les deux index qui viennent d'être créés
Déposer l'index iDate sur l'onglet 1 ;
Déposer l'index iName sur l'onglet 1 ;
Comparaison des instructions ACCESS et UPDATE dans SQLSERVER :
Instruction UPDATE pour mettre à jour plusieurs tables dans SQLSERVER :
MISE À JOUR Onglet1
SET a.Nom = b.Nom
DE Tab1 a, Tab2 b
OÙ a.ID = b.ID ;
L'instruction SQL avec la même fonction dans ACCESS doit être
MISE À JOUR Tab1 a, Tab2 b
SET a.Nom = b.Nom
OÙ a.ID = b.ID ;
Autrement dit : l'instruction UPDATE dans ACCESS n'a pas de clause FROM et toutes les tables référencées sont répertoriées après le mot clé UPDATE.
Dans l'exemple ci-dessus, si Tab2 n'est pas une table, mais une requête, par exemple :
MISE À JOUR Tab1 a, (Sélectionnez l'ID, le nom dans l'onglet 2) b
SET a.Nom = b.Nom
OÙ a.ID = b.ID ;
Accédez à plusieurs bases de données ACCESS différentes - utilisez la clause In dans SQL :
Sélectionnez a.*,b.* Depuis Tab1 a,Tab2 b Dans 'db2.mdb' Où a.ID=b.ID;
L'instruction SQL ci-dessus interroge tous les enregistrements associés à Tab2 dans Tab1 et db2.mdb (dans le dossier actuel) dans la base de données actuelle.
Inconvénients - Les bases de données externes ne peuvent pas avoir de mots de passe.
Supplément : j'ai vu la réponse d'ugvanxk dans un message et je peux l'utiliser
Sélectionnez * dans [c:/aa/a.mdb;pwd=1111].table1;
Test ACCESS XP réussi
Accéder à d’autres sources de données ODBC dans ACCESS
L'exemple suivant interroge les données dans SQLSERVER dans ACCESS
SELECT * FROM Tab1 IN [ODBC]
[ODBC;Driver=SQL Server;UID=sa;PWD=;Server=127.0.0.1;DataBase=Demo;]
Les paramètres complets de la propriété de connexion à la source de données externe sont :
[ODBC;DRIVER=pilote;SERVER=serveur;DATABASE=base de données;UID=utilisateur;PWD=mot de passe;]
DRIVER=le pilote peut être trouvé dans le registre
HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBCINST.INI/
trouvé dans
Pour l'importation de données entre bases de données hétérogènes, veuillez vous référer à Blue Blood Sword
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
ACCESS prend en charge les sous-requêtes
ACCESS prend en charge les jointures externes, mais n'inclut pas les jointures externes complètes. Si elles sont prises en charge,
REJOINDRE À GAUCHE ou REJOINDRE À DROITE
mais pas pris en charge
JOINTURE EXTERNE COMPLÈTE ou JOINTURE COMPLÈTE
Requête de date dans ACCESS
Remarque : Le séparateur de date et d'heure dans ACCESS est # au lieu de guillemets.
Sélectionnez * Depuis l'onglet 1 où [Date]>#2002-1-1# ;
Chez DELPHI, j'utilise ceci
SQL.Add(Format(
'Sélectionnez * Depuis l'onglet 1 où [Date]>#%s#;',
[DateVersStr(Date)]));
Les chaînes dans ACCESS peuvent être séparées par des guillemets doubles, mais SQLSERVER ne les reconnaît pas, donc pour faciliter la migration et la compatibilité,
Il est recommandé d'utiliser des guillemets simples comme délimiteurs de chaîne.