1. Access-Datenbank in DELPHI betreiben (.mdb-Datei erstellen, Datenbank komprimieren)
Der folgende Code hat den Test unter WIN2K, D6, MDAC2.6 bestanden,
Das kompilierte Programm läuft erfolgreich in der zweiten WIN98-Version ohne ACCESS-Umgebung.
//Bevor ComObj,ActiveX verwendet wird
//Deklarieren Sie die Verbindungszeichenfolge
Konst
SConnectionString = 'PRovider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;'
+'Jet OLEDB:Datenbank-Passwort=%s;';
//============================================= =============================
// Prozedur: GetTempPathFileName
// Autor: ysai
// Datum: 27.01.2003
// Argumente: (Keine)
// Ergebnis: string
//============================================= =============================
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: FileName:String;PassWord:string=''
// Ergebnis: boolean
//============================================= =============================
function CreateAccessFile(FileName:String;PassWord:string=''):boolean;
//Access-Datei erstellen, schlägt fehl, wenn die Datei vorhanden ist
var
STempFileName: string;
vCatalog:OleVariant;
beginnen
STempFileName:=GetTempPathFileName;
versuchen
vCatalog:=CreateOleObject('ADOX.Catalog');
vCatalog.Create(format(SConnectionString,[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
STempFileName: string;
vJE:OleVariant;
beginnen
STempFileName:=GetTempPathFileName;
versuchen
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
format(SConnectionString,[STempFileName,APassWord]));
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);
außer
Ergebnis:=false;
Ende;
Ende;
//============================================= =============================
// Prozedur: ChangeDatabasePassword
// Autor: ysai
// Datum: 27.01.2003
// Argumente: AFileName, AOldPassWord, ANewPassWord:string
// Ergebnis: boolean
//============================================= =============================
function ChangeDatabasePassword(AFileName,AOldPassWord,ANewPassWord:string):boolean;
//ACCESS-Datenbankpasswort ändern
var
STempFileName: string;
vJE:OleVariant;
beginnen
STempFileName:=GetTempPathFileName;
versuchen
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(format(SConnectionString,[AFileName,AOldPassWord]),
format(SConnectionString,[STempFileName,ANewPassWord]));
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);
außer
Ergebnis:=false;
Ende;
Ende;
2. Worauf Sie achten sollten und einige Tipps bei der Verwendung von SQL-Anweisungen in ACCESS
Die folgende SQL-Anweisung hat die Abfrage in ACCESS XP übergeben
Tabelle erstellen:
Tabelle Tab1 erstellen (
ID-Zähler,
Namenszeichenfolge,
Alter ganzzahlig,
[Datum] DateTime);
Fähigkeit:
Felder mit automatischer Inkrementierung werden mit Counter 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 erstellen iDate ON Tab1 ([Datum]);
Nach Abschluss wird das Datumsindexattribut des Felds in ACCESS als „Ja (Duplikat)“ angezeigt.
Die folgende Anweisung erstellt einen nicht wiederholbaren Index für die Name-Spalte von Tab1
Erstellen Sie einen eindeutigen Index iName ON Tab1 (Name);
Nach Abschluss wird das Indexattribut des Feldes Name in ACCESS als - Ja (keine Duplizierung) angezeigt.
Die folgende Anweisung löscht die beiden soeben erstellten Indizes
Drop Index iDate ON Tab1;
Drop Index iName ON Tab1;
Vergleich der ACCESS- und UPDATE-Anweisungen in SQLSERVER:
UPDATE-Anweisung zum Aktualisieren mehrerer Tabellen in SQLSERVER:
UPDATE Tab1
SET a.Name = b.Name
VON Tab1 a,Tab2 b
WHERE a.ID = b.ID;
Die SQL-Anweisung mit der gleichen Funktion in ACCESS sollte sein
UPDATE Tab1 a,Tab2 b
SET a.Name = b.Name
WHERE 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 Schlüsselwort UPDATE aufgelistet.
Wenn Tab2 im obigen Beispiel keine Tabelle, sondern eine Abfrage ist, zum Beispiel:
UPDATE Tab1 a,(ID,Name aus Tab2 auswählen) b
SET a.Name = b.Name
WHERE a.ID = b.ID;
Greifen Sie auf mehrere verschiedene ACCESS-Datenbanken 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 in ACCESS auf andere ODBC-Datenquellen zu
Das folgende Beispiel fragt die Daten in SQLSERVER in ACCESS ab
SELECT * FROM Tab1 IN [ODBC]
[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=Treiber;SERVER=Server;DATABASE=Datenbank;UID=Benutzer;PWD=Passwort;]
DRIVER=Treiber finden Sie in der Registrierung
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.
LINKER JOIN oder RECHTER JOIN
aber nicht unterstützt
FULL OUTER JOIN oder FULL JOIN
Datumsabfrage in ACCESS
Hinweis: Das Datums- und Uhrzeittrennzeichen in ACCESS ist # anstelle von Anführungszeichen
Wählen Sie * aus Tab1 aus, wobei [Datum]>#2002-1-1#;
In DELPHI verwende ich dies
SQL.Add(Format(
'Wählen Sie * aus Tab1 aus, wobei [Datum]>#%s#;',
[DateToStr(Date)]));
Zeichenfolgen in ACCESS können durch doppelte Anführungszeichen getrennt werden, SQLSERVER erkennt sie jedoch nicht. Aus Gründen der Migrations- und Kompatibilitätsfreundlichkeit
Es wird empfohlen, einfache Anführungszeichen als Zeichenfolgentrennzeichen zu verwenden.