Verwenden Sie ADO-Objekte, um in DELPHI-Programmen auf ODBC-Daten zuzugreifen
-------------------------------------------------- ----------------------------------
Als ASP-Enthusiast verwende ich häufig ADO-Objekte in ASP-Seiten, um ODBC-Datenbanken zu betreiben. Ich halte es in der Tat für sehr praktisch, ASP zum Erstellen von Webanwendungssystemen zu verwenden. Obwohl der Autor in meiner Programmierkarriere die Produkte der Borland-Serie bevorzugt und Microsoft-Produkten gegenüber etwas abstoßend ist, bin ich bei ASP eine Ausnahme. Eines Tages kam mir plötzlich der Gedanke, dass es sich bei dem ADO-Objekt um ein Standard-OLE-Objekt handelt. Es wäre großartig, wenn ADO zum Betrieb der Datenbank in einer Delphi-Anwendung verwendet werden könnte. Insbesondere wenn Sie DELPHI als Netzwerkdatenbankanwendung verwenden und die Website eine WINNT-Site ist und ASP-Seiten unterstützt, können Sie ADO-Objekte verwenden, um auf die ODBC-Datenbank zuzugreifen, ohne eine so große BDE auf die Site hochladen zu müssen. Auf diese Weise können Sie die Programmiervorteile von DELPHI und ASP voll ausnutzen, um ISAPI/NSAPI/CGI zu verbessern. Nach dem Programmieren und Testen können Sie ADO-Objekte erfolgreich für den Zugriff auf ODBC-Datenbanken in Delphi verwenden. Jetzt werde ich meine Erfahrungen aufschreiben und sie mit allen teilen, damit wir eine andere Methode für den Zugriff auf ODBC-Datenbanken haben.
In 32-Bit-Delphi können Sie eine Variantenvariable (z. B. AVariant) deklarieren und dann über CreateOleObject ein OLE-Objekt erstellen, z. B. AVariant:=CreateOleObject ('ADODB.Connection'), um eine Instanz des Datenbankverbindungsobjekts abzurufen. und dann können Sie die Methoden und Eigenschaften dieses Objekts verwenden, um die ODBC-Datenbank zu betreiben.
Im Folgenden finden Sie eine kurze Einführung in die ADO-Objekte, die für den Zugriff auf ODBC-Datenbanken verwendet werden, sowie in deren Methoden und Eigenschaften.
1. Datenbankverbindungsobjekt (ADODB. Connection)
Dieses Objekt wird verwendet, um eine Verbindung mit der ODBC-Datenbank herzustellen, und alle Vorgänge in der Datenbank werden über diese Verbindung ausgeführt.
Das Datenbankverbindungsobjekt ADODB Connection funktioniert wie das TDatabase-Objekt in Delphi.
Die Methode zum Einrichten eines Verbindungsobjekts lautet (AConnection ist eine Variable vom Typ Variant):
AConnection:=CreateOleObject('A DODB.Connection')
Die zum Herstellen einer Verbindung verwendete Methode ist Open und die Verwendungssyntax lautet (am Beispiel des Objekts AConnection):
AConnection.Open( ConnectionString, UserId, Passwort )
Die drei Parameter sind alle vom Typ String, wobei UserId und Password der Benutzername und das Benutzerkennwort sind, die beim Zugriff auf die Datenbank weggelassen werden können, da der Benutzername und das Benutzerkennwort auch in ConnectionString angegeben werden können. ConnectionString ist eine Zeichenfolge, die zur Beschreibung von ODBC-Datenquelleninformationen verwendet wird. Sein Format ist:
'PRovider=ProviderName; DRIVER=SERVER=Datenbank;
In:
Anbieter: Datenanbieter, standardmäßig MSDASQL, Microsoft OLEDB, normalerweise weggelassen;
DSN: Die der zu öffnenden Datenbank entsprechende OBDC-Systemdatenquelle (DSN) ist ein optionaler Parameter;
TREIBER: Der Name des Treibers, der in der zu öffnenden Datenbank verwendet wird, z. B. der Zugriff, der dem Microsoft Access-Treiber (*.mdb) entspricht. Dies ist ein optionaler Parameter.
SERVER: Der Name des Servers, auf dem sich die zu öffnende Datenbank befindet, der auf diesem Computer verfügbar ist (lokal) und ein optionaler Parameter ist;
DATENBANK: Der Name der zu öffnenden Datenbank, ein optionaler Parameter;
UID: Benutzername, der für den Zugriff auf die Datenbank verwendet wird, ist ein optionaler Parameter;
PWD: Das Benutzerkennwort, das für den Zugriff auf die Datenbank verwendet wird, ist ein optionaler Parameter.
Die oben genannten Parameter sind optional, es müssen jedoch ausreichende Informationen bereitgestellt werden, um eine Systemdatenquelle zu beschreiben.
Wenn ein ODBC-System-DSN definiert wurde und den Namen MyDsn trägt, können Sie die folgende Anweisung verwenden, um eine Datenbankverbindung herzustellen:
AConnection.Open('DSN=MyDsn');
Um Anwendungsfehler zu verhindern, wenn der DSN nicht vorhanden ist oder seine Einstellungen von anderen geändert werden, können Sie mit ADODB.Connection eine temporäre ODBC-Datenquelle erstellen. Dadurch kann sichergestellt werden, dass die Parametereinstellungen des von uns verwendeten System-DSN korrekt sind . Die folgende Anweisung kann einen temporären ODBC-System-DSN erstellen, der einer ACCESS-Datenbank entspricht. Der Pfad lautet C:Inetpub wwwroot test.mdb:
AConnection.open('Driver= {Microsoft Access Driver (*.mdb)};DBQ=C:inetpub wwwroot est.mdb')
Wenn nach dem Herstellen einer ADODB.Connection keine Notwendigkeit besteht, die Operationsergebnisse zurückzugeben (z. B. Löschen, Ändern, Aktualisieren usw.), können Sie zu diesem Zeitpunkt normale SQL-Vorgänge für die Datenbank ausführen , Ausführen, wird verwendet.
AConnection.Execute( strSQL );
Unter diesen ist strSQL die SQL-Anweisung zum Ausführen des Vorgangs. Der Löschvorgang kann beispielsweise sein: „Delete from wfjcommu“. Verwenden Sie AConnection.Close, um eine Datenbankverbindung zu schließen.
2. Datensatzobjekt (ADODB. RecordSet)
Wenn Sie Abfragevorgänge ausführen und Abfrageergebnisse zurückgeben möchten oder die Datentabelle bequemer bedienen möchten, müssen Sie das Dataset-Objekt verwenden.
Das Datensatzobjekt ADODB.RecordSet verhält sich in Delphi wie ein TTable- oder TQuery-Objekt.
Die Methode zum Erstellen eines Datensatzobjekts lautet (ARecordSet ist eine Variable vom Typ Variant):
ARecordSet:=CreateOleObject ('ADODB.RecordSet')
Die Methode zum Abrufen von Daten aus der Datentabelle ist die Open-Methode. Die spezifische Verwendungsmethode ist:
ARecordSet.Open( strCommand,ActiveConnection,int CursorType,intLockType, intCommandType);
In:
strCommand: Zeichenfolge, bei der es sich um einen Tabellennamen, eine SQL-Anweisung oder einen gespeicherten Prozedurnamen (StoredProc) auf dem Server handeln kann. Der spezifische Parameter muss durch den folgenden Parameter intCommandType angegeben werden.
ActiveConnection: Die zu verwendende Datenbankverbindung ist ein ADODB-Verbindungsobjekt.
intCursorType: lange Ganzzahl, Cursortyp des Datensatzes, optionale Parameter, siehe Kommentare im Programm.
intLockType: lange Ganzzahl, der Sperrtyp der Datentabelle, optionale Parameter, siehe Kommentare im Programm.
intCommandType: Lange Ganzzahl, der Typ des Befehlsparameters, der zur Angabe der Rolle von strCommand verwendet wird. Sie können strCommand als Befehl (z. B. als SQL-Anweisung) oder als Datentabelle (TTable) oder als gespeicherte Prozedur (StoredProc) angeben Parameter finden Sie in den Kommentaren im Programm.
Um eine SQL-Abfrage auszuführen, können Sie die folgende Anweisung verwenden:
ARecordSet.Open('Select * from wfjcommu',adOpenStatic,ad LockOptimistic,adCmdText);
Weitere allgemeine Eigenschaften und Methoden im Vergleich zu TTable und TQuery sind die folgenden (Einzelheiten finden Sie in der ASP-Hilfedatei):
eof,bof: eof,bof. MoveFirst, MoveLast: First, LastMovePrevious, MoveNext: Prior, NextMove: MoveByAddNew: appendUpdate: PostClose: schließen
Löschen plus Update: Löschen, alle Änderungen an der Datentabelle müssen Update verwenden, um den Vorgang wirksam zu machen, was sich von Delphi unterscheidet.
Felder[FieldNo]: Felder[FieldNo]
Felder['FieldName']: FieldByName('FieldName')
3. Andere gemeinsame Objekte (Objekte, die Delphi entsprechen):
ADODB.Field: TField ADODB.Parameter: TPara ADODB.Error: EDBEngineError
ADODB.Command: Keine ADODB.Property: Keine
Schauen wir uns ein Anwendungsbeispiel an:
procedure TForm1.Button1Click(Sender: TObject);
{***************************************************** ***** ****
Verwenden Sie ADO, um die ODBC-Datenbank zu betreiben
In diesem Programm wird eine temporäre ODBC-Systemdatenquelle erstellt, die auf eine MsAccess-Datenbank verweist. Anschließend werden die darin enthaltenen Datentabellen angezeigt, hinzugefügt, geändert, gelöscht und abgefragt.
HINWEIS: Bitte geben Sie die ComObj-Einheit in die Uses-Anweisung ein
************************************************** * ***}
const{Einige Konstantendeklarationen, Einzelheiten finden Sie in adovbs.inc}
{----Konstante Beschreibung von CommandType----}
adCmdUnknown = 0008;//Unbekannt, muss anhand des Systems beurteilt werden, langsam, Standardwert
adCmdText = 0001;//Befehlsanweisung wie SQL-Anweisung
adCmdTable = 0002; //Datentabellenname
adCmdStoredProc = 0004;//Name der gespeicherten Prozedur
{----Konstante Beschreibung von CursorType----}
adOpenForwardOnly = 0;// Der Zugriff kann nur in einer Richtung von vorne nach hinten erfolgen, was der Standardwert ist
adOpenKeyset = 1;//Änderungen an Daten durch andere Benutzer sind sichtbar, Hinzufügungen und Löschungen durch andere Benutzer sind jedoch nicht sichtbar.
adOpenDynamic = 2; //Ergänzungen, Änderungen und Löschungen von Daten durch andere Benutzer sind sichtbar
adOpenStatic = 3; //Hinzufügungen, Änderungen und Löschungen von Daten durch andere Benutzer sind nicht sichtbar
{----Konstante Beschreibung von LockType---}
adLockReadOnly = 1; //Schreibgeschützt, der Standardwert
adLockPessimistic = 2; // Beim Ändern nach einzelnem Datensatz sperren
adLockOptimistic = 3; //Beim Aktualisieren nach der Änderung nach einzelnem Datensatz sperren
adLockBatchOptimistic = 4; //Datensatzsperre während der Stapelaktualisierung
var
AConnection, ARecordSet: Variante;
longintTemp: Ganzzahl;
strTemp: string;
intIndex: Ganzzahl;
beginnen
{Erstellen Sie eine temporäre ODBC-Datenquelle, verweisen Sie auf eine MsAccess-Datenbank und verwenden Sie diesen DSN, um eine Datenbankverbindung herzustellen}
AConnection := CreateOleObject('ADODB.Connection');
AConnection.Open('Driver={Microsoft Access Driver (*.mdb)};DBQ=C:inetpubwwwroot est');
{Erstellen Sie ein Datensatzobjekt und extrahieren Sie Daten aus der Datentabelle}
ARecordSet := CreateOleObject('ADODB.RecordSet');
ARecordSet.open( 'wfjcommu',AConnection,adOpenStatic,adLockOptimistic,adCmdTable );
memo1.lines.clear;
memo1.lines.add('Der ursprüngliche Inhalt der ********Datentabelle lautet wie folgt********');
{Den Domänennamen jeder Domäne anzeigen}
strTemp := '';
for intIndex := 0 to ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].name+';';
memo1.lines.add( strTemp );
{Zeigen Sie den Inhalt jeder Domain an}
während ARecordSet.eof dies nicht tut
beginnen
strTemp := '';
for intIndex := 0 to ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//Gehe zum nächsten Balken, Next
Ende;
{Einen Datensatz hinzufügen}
ARecordSet.AddNew;//Add,Append
ARecordSet.Fields['AName'] := '1';//Zugriff über FieldByName
ARecordSet.Fields['Portable'] := '2';
ARecordSet.Fields(2) := '3';//Zugriff in Form von Fields[index]
ARecordSet.Fields(3) := '4';
ARecordSet.Fields(4) := '5';
ARecordSet.Update;//Update, Post
ARecordSet.MoveFirst;//Zum ersten Element verschieben, First
memo1.lines.add('********Der Inhalt der Datentabelle nach dem Hinzufügen eines Datensatzes ist wie folgt********');
{Zeigen Sie den Inhalt jeder Domain an}
während ARecordSet.eof dies nicht tut
beginnen
strTemp := '';
for intIndex := 0 to ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//Gehe zum nächsten Balken, Next
Ende;
{Ändern Sie den letzten Datensatz}
ARecordSet.MoveLast;
ARecordSet.Fields['AName'] := '11';//Zugriff über FieldByName
ARecordSet.Fields['Portable'] := '22';
ARecordSet.Fields(2) := '33';//Zugriff in Form von Fields[index]
ARecordSet.Fields(3) := '44';
ARecordSet.Fields(4) := '55';
ARecordSet.Update;//Update, Post
ARecordSet.MoveFirst;//Zum ersten Element verschieben, First
memo1.lines.add('********Der Inhalt der Datentabelle nach der Änderung des letzten Datensatzes ist wie folgt********');
{Zeigen Sie den Inhalt jeder Domain an}
während ARecordSet.eof dies nicht tut
beginnen
strTemp := '';
for intIndex := 0 to ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//Gehe zum nächsten Balken, Next
Ende;
{letzten Datensatz löschen}
ARecordSet.MoveLast;//Zum letzten Takt wechseln, Last
ARecordSet.delete;//Löschen, löschen
ARecordSet.Update;//Update, in Delphi nicht erforderlich
ARecordSet.MoveFirst;//Zum ersten Element verschieben, First
memo1.lines.add('********Der Inhalt der Datentabelle nach dem Löschen des letzten Datensatzes ist wie folgt********');
{Zeigen Sie den Inhalt jeder Domain an}
während ARecordSet.eof dies nicht tut
beginnen
strTemp := '';
for intIndex := 0 to ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//Gehe zum nächsten Balken, Next
Ende;
ARecordSet.Close;{Datensatz schließen}
{Verwenden Sie eine SQL-Anweisung, um die Datensätze mit dem Namen „Zhang San“ abzufragen}
{Beachten Sie, dass Zeichenfolgen in SQL-Anweisungen in einfache Anführungszeichen gesetzt werden sollten}
ARecordSet.open( 'select * from wfjcommu where AName = ''Zhang San''',
AConnection,adOpenStatic,adLockOptimistic,adCmdText );
memo1.lines.add('********Zhang Sans Inhalt ist wie folgt********');
memo1.lines.add( 'Total' + IntToStr( ARecordSet.RecordCount ) + 'Übereinstimmende Datensätze' );
{Zeigen Sie den Inhalt jeder Domain an}
während ARecordSet.eof dies nicht tut
beginnen
strTemp := '';
for intIndex := 0 to ARecordSet.Fields.count - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//Gehe zum nächsten Balken, Next
Ende;
{Datensatz- und Datenbankverbindung schließen}
ARecordSet.close;
AConnection.close;
Ende;
Hören Sie anderen zu und sagen Sie, dass es besser ist, es selbst zu erleben, indem Sie sich tatsächliche Beispiele ansehen. In diesem Beispiel zeigen wir, wie Sie ADO-Objekte zum Abfragen, Hinzufügen von Datensätzen, Ändern von Datensätzen und Löschen von Datensätzen in einer Datentabelle verwenden. Informationen zur spezifischen Verwendung finden Sie in den Kommentaren im Programm. Wenn Sie Erfahrung in der Delphi-Datenbankprogrammierung haben, ist dies meiner Meinung nach nicht schwer zu verstehen.
Die in unserem Beispiel verwendete Datenbank ist Test.MDB, die über eine Datentabelle namens wfjcommu mit fünf Feldern AName, Portable, Tel, BP und PostAddress verfügt, die Name, Mobiltelefonnummer, Telefonnummer, Pager-Nummer und Postanschrift darstellen jeweils.
Das obige Programm wurde debuggt und unter PWIN98+ Delphi 3.0+PWS (Personal Web Server) 4.0 weitergegeben.