DataSnap サーバーでサーバー側コンポーネントを作成する(InterBase チュートリアル)
チュートリアル:Delphi および C++ アプリケーションで InterBase データベースを使用する への移動
サーバーは Delphi と C++ のいずれでも実装できます。 この例では両方を示します。 クライアントを同じ言語で実装する必要はありません。 DataSnap では、Delphi でサーバーを、C++ でクライアントを実装することも、その逆の組み合わせにすることも可能です。
以下の手順でサーバーを作成します。
- 新しいプロジェクトを作成します。
- Delphi の場合は、[ファイル|新規作成|VCL フォーム アプリケーション - Delphi]を選択して、新しい Delphi プロジェクトを作成します。
- C++ の場合は、[ファイル|新規作成|VCL フォーム アプリケーション - C++Builder]を選択して、新しい C++Builder プロジェクトを作成します。
- [ツール パレット]の[Datasnap Server]カテゴリから、次のコンポーネントをフォームにドラッグします。
- フォームの[Caption]プロパティを「ServerForm」に設定します。 [ファイル|すべて保存]をクリックしてプロジェクトを保存します。
- Delphi の場合は、ファイルを「ServerForm.pas」、プロジェクトを「ServerDemo.dproj」という名前で保存します。
- C++ の場合は、ファイルを「ServerForm.cpp」、プロジェクトを「ServerDemo.cbproj」という名前で保存します。
- フォームの[Caption]プロパティを「ServerForm」に設定します。 [ファイル|すべて保存]をクリックしてプロジェクトを保存します。
- これで、サーバーは次のようになります。
- 次に示す手順に従って、3 つのコンポーネントを互いにリンクします。
- TDSServerClass コンポーネントをフォーム上で選択します。 ドロップダウン メニューを使って、[Server]プロパティの値を TDSServer コンポーネントの名前(この例では "DSServer1")に設定します。
- TDSTCPServerTransport コンポーネントをフォーム上で選択します。 ドロップダウン メニューを使って、[Server]プロパティの値を TDSServer コンポーネントの名前(この例では "DSServer1")に設定します。
- 次のいずれかの方法で[新規作成]ダイアログを開きます。
Delphi
[Delphi プロジェクト|DataSnap Server]をクリックし、[サーバー モジュール]という新しい Delphi ファイルを追加します。 [サーバー モジュール]を選択して[OK]をクリックします。 モジュールを「Un_ServerModule.pas」という名前で保存します。
C++
[C++Builder プロジェクト|DataSnap Server]をクリックし、[サーバー モジュール]という新しい C++ ファイルを追加します。 [サーバー モジュール]を選択して[OK]をクリックします。 モジュールを「Un_ServerModule.cpp」という名前で保存します。
- Un_ServerModule は、さまざまなデータベース コントロールを追加することができるデータ モジュールです。 また、コード エディタを使って public メソッドをコードに追加することもできます(後で行います)。
- プロジェクトにコンポーネントを追加するには、[データ エクスプローラ]から項目をドラッグします。 RAD Studio の右側のペインで[データ エクスプローラ]タブをクリックします。 [INTERBASE]タブが開いていない場合には、開きます。 [INTERBASE]タブの下の、[EMPLOYEE]を開き、さらに[テーブル]を開きます。 [EMPLOYEE]テーブルを Un_server_module のフォームにドラッグします。これにより、次の 2 つの dbExpress コンポーネントが新しくフォームに追加されます。
- TSQLConnection コンポーネント。 [Name]プロパティを「EMPLOYEE_CONNECTION」に設定します。
- TSQLDataSet コンポーネント。 [Name]プロパティを「EMPLOYEE_TABLE」に設定します。
- さらに 2 つのコンポーネントを Un_ServerModule のフォームに配置します。
- [TDataSetProvider] を追加します。
- [DataSet]プロパティをドロップダウン メニューの "EMPLOYEE_TABLE" に設定します。
- 名前を「ServerDataSetProvider1」に変更し、後で追加するもう 1 つの TDataSetProvider と区別できるようにします。
- [TSQLStoredProc] コンポーネントを追加します。
- [SQLConnection]プロパティをドロップダウン メニューの "EMPLOYEE_CONNECTION" に設定します。
- [StoredProcName]プロパティをドロップダウン メニューの "GET_EMP_PROJ" に設定します。 "GET_EMP_PROJ" は、EMPLOYEE データベースのストアド プロシージャの 1 つです。 このストアド プロシージャは、従業員番号に関連付けられたプロジェクト ID を取得します。
public
として公開したい関数を Un_ServerModule に追加します。- 追加した関数のコードを書きます。
- RAD Studio ファイル リストの[ServerForm]タブをクリックして ServerForm に戻ります。 [デザイン]タブをクリックし、それからフォームをクリックします。 TDSServerClass コンポーネントを選択します。 TDSServerClass コンポーネントの[オブジェクト インスペクタ]で、[イベント]タブをクリックし、[OnGetClass]をダブルクリックします。 このイベント ハンドラ コードでは、サーバーがどのサーバー クラスを使用するかを決定します。
- Delphi の場合は、ServerForm ユニットの
uses
セクションに Un_ServerModule を追加して、TDSServerModule1 を認識できるようにします。 - C++ の場合は、ServerForm.cpp の他のインクルードの後に次の行を追加します。
- ユニットを保存します。 サーバー プロジェクトをビルドし、エラーがあれば修正します。ただし、サーバーの実行はまだ行いません。
- RAD Studio の[プロジェクト マネージャ]タブをクリックします。 プロジェクト グループを右クリックし、[プロジェクト グループに名前を付けて保存...]をクリックして、プロジェクト グループを保存します。 プロジェクト グループは「DSProj.groupproj」という名前で保存します。 次のセクションでは、このプロジェクト グループにプロジェクトをもう 1 つ追加します。
テーブルをフォームにドラッグしたときに、2 つのコンポーネントは自動的に接続されます。 EMPLOYEE_TABLE の[SQLConnection]プロパティは、既に EMPLOYEE_CONNECTION TSQLConnection に設定されています。
これで、データ モジュールは次の図のようになります。 この図は Delphi プロジェクトのものですが、C++Builder プロジェクトもほとんど同じです。
メモ: Un_ServerModule の
public
セクションに置かれたサーバー メソッドはどれも、クライアントから呼び出される可能性があります。
Delphi
[コード]タブをクリックします。 type
セクションの public
の下に、次の関数宣言を追加します。
function callStoredProcedure (mylocalkey : Integer): String;
Ctrl+Shift+C
を押してクラス補完を使用し、この関数のスタブを implementation
セクションに作成します。
C++
[Un_ServerModule.h]タブをクリックしてヘッダー ファイルを表示します。 public:
の下に次の関数を追加します。
String _fastcall callStoredProcedure (int mylocalkey);
callStoredProcedure
関数では、整数パラメータの従業員番号(EMP_NO)を渡してストアド プロシージャを呼び出します。 この関数は AnsiString
のプロジェクト ID(PROJ_ID)を取得します。 関数は、入力パラメータを設定し、プロシージャを実行し、出力パラメータを受け取ります。 この関数は、後でクライアント側で記述する関数と、パラメータが対応しています。 TSQLStoredProc コンポーネントの[StoredProcName]プロパティの値は、既にストアド プロシージャ名 "GET_EMP_PROJ" に設定しました。
Delphi
次の関数を Un_ServerModule.pas に追加します。
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++
次の関数を Un_ServerModule.cpp の他のメンバ関数の後に追加します。
String _fastcall TDSServerModule1::callStoredProcedure (int mylocalkey)
{
String myString;
SQLStoredProc1->ParamByName("EMP_NO")->AsInteger = mylocalkey;
SQLStoredProc1->ExecProc();
myString = SQLStoredProc1->ParamByName("PROJ_ID")->AsString;
return myString;
}
実際のストアド プロシージャのパラメータ名(EMP_NO および PROJ_ID)を使用しているため、ParamByName
によって順序値を取得しています。
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);
}
PersistentClass
変数に、オブジェクト参照ではなくクラス参照が代入されていることに注意してください。
ServerForm で必要な Un_ServerModule へのリンクを作成します。
# include "Un_ServerModule.h"
これでサーバーが完成しました。このサーバーは次の 2 つの処理を行います。
- 更新可能なデータベース データを提供する
- ストアド プロシージャを実行して値を返す