1. Access-Datenbank in Delphi betreiben (.mdb-Datei erstellen, Datenbank komprimieren)
Der folgende Code wurde unter win2k, d6 und mdac2.6 getestet.
Das kompilierte Programm läuft erfolgreich in der zweiten Win98-Version ohne Zugriffsumgebung.
//bevor comobj,activex verwendet wird
//Deklarieren Sie die Verbindungszeichenfolge
const
Connectionstring = 'provider=microsoft.jet.oledb.4.0;data source=%s;'
+'jet oledb:Datenbankpasswort=%s;';
//============================================= =============================
// Prozedur: gettemppathfilename
// Autor: Ysai
// Datum: 27.01.2003
// Argumente: (keine)
// Ergebnis: Zeichenfolge
//============================================= =============================
function gettemppathfilename():string;
//Den temporären Dateinamen abrufen
var
spath,sfile&:array [0..254] of char;
beginnen
gettemppath(254,spath);
gettempfilename(spath,'~sm',0,sfile);
result:=sfile;
deletefile(pchar(result));
Ende;
//============================================= =============================
// Prozedur: createaccessfile
// Autor: Ysai
// Datum: 27.01.2003
// Argumente: Dateiname:string;passwort:string=''
// Ergebnis: boolean
//============================================= =============================
function createaccessfile(filename:string;password:string=''):boolean;
//Zugriffsdatei erstellen, schlägt fehl, wenn die Datei vorhanden ist
var
stemfilename:string;
vcatalog:olevariant;
beginnen
stempfilename:=gettemppathfilename;
versuchen
vcatalog:=createoleobject('adox.catalog');
vcatalog.create(format(connectionstring,[stempfilename,password]));
result:=copyfile(pchar(stempfilename),pchar(filename),true);
deletefile(stempfilename);
außer
Ergebnis:=false;
Ende;
Ende;
//============================================= =============================
// Prozedur: Compactdatabase
// Autor: Ysai
// Datum: 27.01.2003
// Argumente: afilename,apassword:string
// Ergebnis: boolean
//============================================= =============================
function compactdatabase(afilename,apassword:string):boolean;
//Datenbank komprimieren und reparieren, Quelldateien überschreiben
var
stemfilename:string;
vje:olevariant;
beginnen
stempfilename:=gettemppathfilename;
versuchen
vje:=createoleobject('jro.jetengine');
vje.compactdatabase(format(Verbindungszeichenfolge,[einDateiname,einPasswort]),
format(sconnectionstring,[stempfilename,apassword]));
result:=copyfile(pchar(stempfilename),pchar(afilename),false);
deletefile(stempfilename);
außer
Ergebnis:=false;
Ende;
Ende;
//============================================= =============================
// Prozedur: Datenbankpasswort ändern
// Autor: Ysai
// Datum: 27.01.2003
// Argumente: afilename,aoldpassword,anewpassword:string
// Ergebnis: boolean
//============================================= =============================
Funktion changedatabasepassword(afilename,aoldpassword,anewpassword:string):boolean;
//Passwort für die Zugriffsdatenbank ändern
var
stemfilename:string;
vje:olevariant;
beginnen
stempfilename:=gettemppathfilename;
versuchen
vje:=createoleobject('jro.jetengine');
vje.compactdatabase(format(Verbindungszeichenfolge,[einDateiname,einaltesPasswort]),
format(sconnectionstring,[stempfilename,anewpassword]));
result:=copyfile(pchar(stempfilename),pchar(afilename),false);
deletefile(stempfilename);
außer
Ergebnis:=false;
Ende;
Ende;
2. Dinge, auf die Sie achten sollten, und einige Tipps bei der Verwendung von SQL-Anweisungen im Zugriff
Die folgende SQL-Anweisung hat den Test in der Access XP-Abfrage bestanden
Tabelle erstellen:
Tabelle tab1 erstellen (
ID-Zähler,
Namenszeichenfolge,
Alter ganzzahlig,
[Datum] DatumUhrzeit);
Fähigkeit:
Felder mit automatischer Inkrementierung werden mit einem Zähler deklariert.
Felder, deren Feldnamen Schlüsselwörter sind, werden in eckige Klammern [] eingeschlossen, und auch Zahlen sind als Feldnamen zulässig.
Index erstellen:
Die folgende Anweisung erstellt einen wiederholbaren Index für die Datumsspalte von tab1
Index-Idate für Tab1 ([Datum]) erstellen;
Nach Abschluss wird das Datumsindexattribut des Felds im Zugriff als „Ja“ angezeigt (es liegen Duplikate vor).
Die folgende Anweisung erstellt einen nicht wiederholbaren Index für die Namensspalte von tab1
Erstellen Sie einen eindeutigen Index inname für tab1 (Name);
Nach Abschluss wird das Indexattribut des Feldnamens im Zugriff als „Ja“ (keine Duplizierung) angezeigt.
Die folgende Anweisung löscht die beiden soeben erstellten Indizes
Index-Idate auf Tab1 löschen;
Indexname auf Tab1 löschen;
Vergleich der Update-Anweisungen in Access und SQLServer:
Update-Anweisung zum Aktualisieren mehrerer Tabellen in SQL Server:
Tab1 aktualisieren
setze a.name = b.name
von tab1 a, tab2 b
wobei a.id = b.id;
Die SQL-Anweisung mit der gleichen Funktion im Zugriff sollte sein
Tab1 a, Tab2 b aktualisieren
setze a.name = b.name
wobei a.id = b.id;
Das heißt: Die Update-Anweisung in Access verfügt über keine From-Klausel und alle referenzierten Tabellen werden nach dem Update-Schlüsselwort aufgelistet.
Wenn tab2 im obigen Beispiel keine Tabelle, sondern eine Abfrage ist, zum Beispiel:
Tab1 a aktualisieren, (ID, Name aus Tab2 auswählen) b
setze a.name = b.name
wobei a.id = b.id;
Greifen Sie auf mehrere verschiedene Zugriffsdatenbanken zu – verwenden Sie die in-Klausel in SQL:
Wählen Sie a.*,b.* aus tab1 a,tab2 b in 'db2.mdb' aus, wobei a.id=b.id;
Die obige SQL-Anweisung fragt alle Datensätze ab, die tab2 in tab1 und db2.mdb (im aktuellen Ordner) in der aktuellen Datenbank zugeordnet sind.
Nachteile – Externe Datenbanken können keine Passwörter haben.
Ergänzung: Ich habe die Antwort von ugvanxk in einem Beitrag gesehen und kann sie verwenden
Wählen Sie * aus [c:/aa/a.mdb;pwd=1111].table1;
Access XP-Test bestanden
Greifen Sie im Zugriff auf andere ODBC-Datenquellen zu
Das folgende Beispiel fragt Daten in SQL Server in Access ab
Wählen Sie * aus Tab1 in [odbc] aus
[odbc;driver=sql server;uid=sa;pwd=;server=127.0.0.1;database=demo;]
Die vollständigen Parameter der Verbindungseigenschaft für externe Datenquellen sind:
[odbc;driver=driver;server=server;database=database;uid=user;pwd=password;]
Der Treiber=Treiber ist in der Registrierung zu finden
hkey_local_machine/software/odbc/odbcinst.ini/
gefunden in
Informationen zum Datenimport zwischen heterogenen Datenbanken finden Sie unter Blue Blood Sword
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
Access unterstützt Unterabfragen
Access unterstützt Outer-Joins, schließt jedoch keine vollständigen Outer-Joins ein, sofern diese unterstützt werden
Linksverknüpfung oder Rechtsverknüpfung
aber nicht unterstützt
vollständiger äußerer Join oder vollständiger Join
Datumsabfrage im Zugriff
Hinweis: Das Datums- und Uhrzeittrennzeichen im Zugriff ist # anstelle von Anführungszeichen
Wählen Sie * aus Tab1 aus, wobei [Datum]>#2002-1-1#;
In Delphi verwende ich dies
sql.add(format(
'select * from tab1 where [date]>#%s#;',
[datetostr(date)]));
Zeichenfolgen im Zugriff können durch doppelte Anführungszeichen getrennt werden, SQL Server erkennt sie jedoch nicht. Aus Gründen der Migrations- und Kompatibilitätsfreundlichkeit
Es wird empfohlen, einfache Anführungszeichen als Zeichenfolgentrennzeichen zu verwenden.