Erstellen eines Servers mit DataSnap (InterBase-Tutorial)
Nach oben zu Tutorial: Eine InterBase-Datenbank in einer Delphi- oder C++-Anwendung verwenden
Ein Server kann entweder in Delphi oder C++ implementiert werden. Dieses Beispiel beschreibt das Vorgehen für beide Sprachen. Der Client muss nicht in derselben Sprache implementiert werden. Sie können z.B. einen Delphi-Server und einen C++-Client oder umgekehrt verwenden.
Führen Sie zum Erstellen eines Servers die folgenden Schritte aus.
- Erstellen Sie ein neues Projekt.
- Delphi: Wählen Sie Datei > Neu > VCL-Formularanwendung - Delphi, um ein neues Delphi-Projekt zu erstellen.
- C++: Wählen Sie Datei > Neu > VCL-Formularanwendung - C++Builder, um ein neues C++Builder-Projekt zu erstellen.
- Ziehen Sie die folgenden Komponenten aus der Kategorie DataSnap-Server der Tool-Palette auf das Formular:
-
- Setzen Sie die Eigenschaft Caption des Formulars auf "ServerForm". Wählen Sie Datei > Alles speichern, um das Projekt zu speichern.
- Delphi: Speichern Sie die Datei unter dem Namen ServerForm.pas und das Projekt unter dem Namen ServerDemo.dproj.
- C++: Speichern Sie die Datei unter dem Namen ServerForm.cpp und das Projekt unter dem Namen ServerDemo.cbproj.
- Setzen Sie die Eigenschaft Caption des Formulars auf "ServerForm". Wählen Sie Datei > Alles speichern, um das Projekt zu speichern.
-
- Ihr Serverformular sollte nun folgendermaßen aussehen:
- Führen Sie die folgenden Schritte aus, um die drei Komponenten miteinander zu verknüpfen:
- Wählen Sie die TDSServerClass-Komponente auf dem Formular aus. Setzen Sie im Dropdown-Menü deren Eigenschaft Server auf den Namen Ihrer TDSServer-Komponente (DSServer1 in diesem Beispiel).
- Wählen Sie die TDSTCPServerTransport-Komponente auf dem Formular aus. Setzen Sie im Dropdown-Menü deren Eigenschaft Server auf den Namen Ihrer TDSServer-Komponente (DSServer1 in diesem Beispiel).
- Öffnen Sie das Dialogfeld Objektgalerie mit einer der folgenden Methoden:
- Klicken Sie in der Symbolleiste auf die Schaltfläche Objektgalerie
.
- Wählen Sie Datei > Neu > Weitere.
Fügen Sie eine neue Delphi-Datei als Server-Modul hinzu. Klicken Sie dazu auf Delphi-Projekte > DataSnap-Server, wählen Sie Server-Modul aus, und klicken Sie auf OK. Speichern Sie das Modul unter dem Namen Un_ServerModule.pas.
C++
Fügen Sie eine neue C++-Datei als Server-Modul hinzu. Klicken Sie dazu auf C++Builder-Projekte > DataSnap-Server, wählen Sie Server-Modul aus, und klicken Sie auf OK. Speichern Sie das Modul unter dem Namen Un_ServerModule.cpp.
- Klicken Sie in der Symbolleiste auf die Schaltfläche Objektgalerie
- Un_ServerModule ist ein Datenmodul, dem Sie verschiedene Datenbanksteuerelemente hinzufügen können. Dem Quellcode des Moduls können Sie im Quelltext-Editor auch public Methoden hinzufügen, wie weiter unten gezeigt.
- Sie können einem Projekt Komponenten hinzufügen, indem Sie Elemente aus dem Daten-Explorer ziehen. Klicken Sie im rechten Bereich von RAD Studio auf die Registerkarte Daten-Explorer. Falls der Knoten INTERBASE nicht geöffnet ist, holen Sie dies nach. Öffnen Sie unter INTERBASE den Knoten EMPLOYEE und dann den Knoten Tabellen. Ziehen Sie die Tabelle EMPLOYEE auf das Formular Un_server_module. Dadurch werden dem Formular zwei neue dbExpress-Komponenten hinzugefügt:
- Eine TSQLConnection-Komponente. Setzen Sie deren Eigenschaft Name auf "EMPLOYEE_CONNECTION".
- Eine TSQLDataSet-Komponente. Setzen Sie deren Eigenschaft Name auf "EMPLOYEE_TABLE".
- Platzieren Sie zwei weitere Komponenten auf dem Formular Un_ServerModule:
- Fügen Sie eine TDataSetProvider-Komponente hinzu.
- Setzen Sie im Dropdown-Menü deren Eigenschaft DataSet auf "EMPLOYEE_TABLE".
- Ändern Sie die Eigenschaft Name in ServerDataSetProvider1, um die Komponente von einer anderen TDataSetProvider-Komponente zu unterscheiden, die später hinzugefügt wird.
- Fügen Sie eine TSQLStoredProc-Komponente hinzu.
- Setzen Sie im Dropdown-Menü deren Eigenschaft SQLConnection auf "EMPLOYEE_CONNECTION".
- Setzen Sie im Dropdown-Menü die Eigenschaft StoredProcName auf "GET_EMP_PROJ". "GET_EMP_PROJ" ist eine der Stored Procedures in der Datenbank Employee. Diese Stored Procedure ermittelt eine Projekt-ID, die einer Mitarbeiternummer zugeordnet ist.
- Fügen Sie eine TDataSetProvider-Komponente hinzu.
- Fügen Sie zu Un_ServerModule die Funktionen hinzu, die als
public
bereitgestellt werden sollen.Hinweis: Alle Servermethoden im Abschnitt
public
von Un_ServerModule können von dem Client aufgerufen werden.Delphi
Klicken Sie auf das Register Code. Fügen Sie in den Abschnitt
type
unterpublic
die folgende Funktionsdeklaration ein:function callStoredProcedure (mylocalkey : Integer): String;
Erstellen Sie mithilfe der Klassenvervollständigung durch Drücken vonSTRG+UMSCH+C
imimplementation
-Abschnitt ein Stub für diese Funktion.C++
Klicken Sie auf das Register Un_ServerModule.h, um die Header-Datei anzuzeigen. Fügen Sie unter
public:
die folgende Funktion hinzu:String _fastcall callStoredProcedure (int mylocalkey);
- Schreiben Sie den Quellcode für die gerade hinzugefügte Funktion.
Die Funktion
callStoredProcedure
ruft eine Stored Procedure mit dem Integer-Parameter "Mitarbeiternummer" (EMP_NO) auf. Die Funktion ermittelt eineAnsiString
-Projekt-ID (PROJ_ID). Die Funktion setzt den Eingabeparameter, führt die Prozedur aus und ruft den Ausgabeparameter ab. Die Funktion entspricht hinsichtlich der Parameter der Funktion, die später im Client geschrieben wird. Den Wert der Eigenschaft StoredProcName der TSQLStoredProc-Komponente haben Sie bereits auf den Namen der Stored Procedure, "GET_EMP_PROJ", gesetzt. Delphi Fügen Sie Un_ServerModule.pas' die folgende Funktion hinzu:function TDSServerModule1.callStoredProcedure(mylocalkey: Integer): String; var myString : String; begin SQLStoredProc1.ParamByName('EMP_NO').AsInteger := mylocalkey; SQLStoredProc1.ExecProc; myString := SQLStoredProc1.ParamByName('PROJ_ID').AsString; result := myString; end;
C++
Fügen Sie diese Funktion nach den anderen Member-Funktionen in Un_ServerModule.cpp ein:
String _fastcall TDSServerModule1::callStoredProcedure (int mylocalkey) { String myString; SQLStoredProc1->ParamByName("EMP_NO")->AsInteger = mylocalkey; SQLStoredProc1->ExecProc(); myString = SQLStoredProc1->ParamByName("PROJ_ID")->AsString; return myString; }
Beachten Sie bitte Folgendes: Weil die tatsächlichen Parameternamen, EMP_NO und PROJ_ID, in der Stored Procedure verwendet werden, wird von
ParamByName
deren Ordinalwert ermittelt. - Wechseln Sie wieder zum Formular ServerForm, indem Sie auf das Register ServerForm klicken. Klicken Sie auf die Registerkarte Design, um das Formular anzuzeigen. Wählen Sie die TDSServerClass-Komponente aus. Klicken Sie im Objektinspektor für die TDSServerClass-Komponente auf das Register Ereignisse, und doppelklicken Sie auf OnGetClass. Der Quellcode dieser Ereignisbehandlungsroutine legt fest, welche Serverklasse der Server verwendet:
Delphi
procedure TForm1.DSServerClass1GetClass(DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass); begin PersistentClass := TDSServerModule1; end;
C++
void __fastcall TForm1::DSServerClass1GetClass(TDSServerClass *DSServerClass, TPersistentClass &PersistentClass) { PersistentClass = __classid(TDSServerModule1); }
Beachten Sie bitte, dass die Variable
PersistentClass
einer Klassenreferenz – keiner Objektreferenz – zugewiesen wird.Legen Sie die erforderliche Verknüpfung von ServerForm zu Un_ServerModule fest.
- Delphi: Fügen Sie dem Abschnitt
uses
der Unit ServerForm den Eintrag Un_ServerModule hinzu, damit TDSServerModule1 erkannt wird. - C++: Fügen Sie die folgende Zeile nach den anderen "includes" in ServerForm.cpp ein:
# include "Un_ServerModule.h"
- Delphi: Fügen Sie dem Abschnitt
- Speichern Sie die Unit. Erzeugen Sie das Serverprojekt, und beheben Sie etwaige Fehler, aber führen Sie den Server noch nicht aus.
- Klicken Sie in RAD Studio auf die Registerkarte Projektverwaltung. Klicken Sie mit der rechten Maustaste auf die Projektgruppe, und wählen Sie Projektgruppe speichern. Speichern Sie die Projektgruppe unter dem Namen DSProj.groupproj. Im nächsten Abschnitt wird dieser Projektgruppe ein weiteres Projekt hinzugefügt.
Damit ist die Erstellung des Servers abgeschlossen. Der Server führt Folgendes aus:
- Bereitstellen von Datenbankdaten, die aktualisiert werden können
- Ausführen einer Stored Procedure und Rückgabe eines Wertes