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 été testé sous win2k, d6 et mdac2.6.
Le programme compilé s'exécute avec succès dans la deuxième version de Win98 sans environnement d'accès.
//avant d'utiliser comobj,activex
//Déclare la chaîne de connexion
const
chaîne de connexion = 'provider=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&:array [0..254] de caractères ;
commencer
gettemppath(254,spath);
gettempfilename(spath,'~sm',0,sfile);
result:=sfile;
deletefile(pchar(résultat));
fin;
//================================================= =============================
// procédure : créer un fichier d'accès
// auteur : ysai
// date : 2003-01-27
// arguments : nom de fichier:string;mot de passe:string=''
// résultat : booléen
//================================================= =============================
function createaccessfile(filename:string;password:string=''):boolean;
//Créer un fichier d'accès, échouer si le fichier existe
var
nom du fichier souche : chaîne ;
vcatalog:olévariant;
commencer
stempfilename:=gettemppathfilename;
essayer
vcatalog:=createoleobject('adox.catalog');
vcatalog.create(format(connectionstring,[stempfilename,password]));
result:=copyfile(pchar(stempfilename),pchar(filename),true);
deletefile(stempfilename);
sauf
résultat :=faux ;
fin;
fin;
//================================================= =============================
// procédure : base de données compacte
// auteur : ysai
// date : 2003-01-27
// arguments : un nom de fichier, un mot de passe : chaîne
// résultat : booléen
//================================================= =============================
function compactdatabase (un nom de fichier, un mot de passe: chaîne): booléen;
// Compresser et réparer la base de données, écraser les fichiers sources
var
nom du fichier souche : chaîne ;
vje:olévariant;
commencer
stempfilename:=gettemppathfilename;
essayer
vje:=createoleobject('jro.jetengine');
vje.compactdatabase (format (chaîne de connexion, [nom de fichier, mot de passe]),
format(sconnectionstring,[stempfilename,apassword]));
result:=copyfile(pchar(stempfilename),pchar(afilename),false);
deletefile(stempfilename);
sauf
résultat :=faux ;
fin;
fin;
//================================================= =============================
// procédure : changement du mot de passe de la base de données
// auteur : ysai
// date : 2003-01-27
// arguments : un nom de fichier, un ancien mot de passe, un nouveau mot de passe : chaîne
// résultat : booléen
//================================================= =============================
function changedatabasepassword(afilename,aoldpassword,anewpassword:string):boolean;
//Modifier le mot de passe d'accès à la base de données
var
nom du fichier souche : chaîne ;
vje:olévariant;
commencer
stempfilename:=gettemppathfilename;
essayer
vje:=createoleobject('jro.jetengine');
vje.compactdatabase (format (chaîne de connexion, [nom de fichier, mot de passe ancien]),
format(sconnectionstring,[stempfilename,anewpassword]));
result:=copyfile(pchar(stempfilename),pchar(afilename),false);
deletefile(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 lors de l'accès
L'instruction SQL suivante a réussi le test dans la requête Access XP
Créer un tableau :
créer le tableau tab1 (
compteur d'identité,
chaîne de nom,
âge entier,
[date] dateheure);
Compétence:
Les champs à incrémentation automatique sont déclarés avec un compteur.
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 de date de l'onglet 1
créer un index idate sur l'onglet 1 ([date]);
Une fois terminé, l'attribut d'index de date du champ en accès s'affiche comme - Oui (il y a des doublons).
L'instruction suivante crée un index non répétable sur la colonne nom de tab1
créer un index unique iname sur tab1 (nom) ;
Une fois terminé, l'attribut d'index du nom du champ en accès s'affiche comme - Oui (pas de duplication).
L'instruction suivante supprime les deux index qui viennent d'être créés
déposez l'index idate sur l'onglet 1 ;
déposez l'index iname sur l'onglet 1 ;
Comparaison des instructions de mise à jour dans access et sqlserver :
Instruction de mise à jour pour mettre à jour plusieurs tables dans sqlserver :
mise à jour de l'onglet 1
définir a.nom = b.nom
à partir de l'onglet 1 a, de l'onglet 2 b
où a.id = b.id ;
L'instruction SQL avec la même fonction dans l'accès doit être
mettre à jour l'onglet 1 a, l'onglet 2 b
définir 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 :
mettre à jour l'onglet 1 a, (sélectionner l'identifiant, le nom dans l'onglet 2) b
définir a.nom = b.nom
où a.id = b.id ;
Accédez à plusieurs bases de données d'accès différentes - utilisez la clause in dans SQL :
sélectionnez a.*,b.* dans 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;
accès au test XP réussi
Accéder à d'autres sources de données ODBC dans Access
L'exemple suivant interroge les données dans sqlserver lors de l'accès
sélectionnez * dans l'onglet 1 dans [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=driver;server=server;database=database;uid=user;pwd=password;]
Le driver=driver se trouve 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
l'accès prend en charge les sous-requêtes
l'accès 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 en accès
Remarque : le séparateur de date et d'heure dans Access est # au lieu de guillemets
sélectionnez * dans l'onglet 1 où [date]>#2002-1-1# ;
Sous Delphi, j'utilise ceci
sql.ajouter(format(
'sélectionnez * dans l'onglet 1 où [date]>#%s#;',
[datetostr(date)]));
Les chaînes d'accès 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.