サーバー側で複数のデータベースを定義し、クライアント側から「接続名」と「クライアントサービス名」を使ってこれらのデータベースにアクセスすることを考えます。
ここでは、MultiDBQueryServiceを実装し、それを特定のクライアントサービス名として登録します。以下はその設定例です:
クライアントサービス名とサービスクラス名を設定すればよいです。他の項目は必要ありません。クライアントサービス名はdjwkQueryService、サービスクラス名はTMultiDBQueryServiceとします。
クライアントはkbmMWClientQueryを使って指定されたデータベースにクエリを送信します:
procedure TForm1.Button1Click(Sender: TObject);
begin
kbmMWClientQuery1.QueryService := '<strong>djwkQueryService</strong>'; // サーバー側で定義したクライアントサービス名
kbmMWClientQuery1.QueryServiceVersion := '1.0';
kbmMWClientQuery1.Query.Text := 'Select * from sys_versioninfo';
kbmMWClientQuery1.ActiveClient.Data := '<strong>djexam</strong>'; // サーバー側で定義したデータベース接続名
kbmMWClientQuery1.Open;
end;
上記コードでは、kbmMWClientQuery.ActiveClient.Dataプロパティをサーバー側で定義したデータベース接続名に設定することで、指定したデータベースに対してクエリを実行できます。
さらに、MultiDBQueryServiceでは、サーバー上で利用可能なすべてのデータベース接続の一覧を取得するメソッドが実装されています。このメソッドの戻り値形式は、カンマ区切りの文字列かJSON形式を選択できます。
procedure TForm1.Button2Click(Sender: TObject);
begin
Label1.Caption := c.Request('djwkQueryService', '1.0', 'GetConnectionNameList', ['string']);
end;
上記の呼び出しでは、カンマ区切りの文字列が返されます。例:hblexam, djexam, djwkexam, zhjg, djet, lsWeb, TestInfo, xmyt, test, dmjh
この結果を分解し、それをComboBoxに追加します。
procedure TForm1.Button2Click(Sender: TObject);
var
s: string;
sa: TArray<string>;
i: Integer;
begin
s := c.Request('djwkQueryService', '1.0', 'GetConnectionNameList', ['string']);
sa := s.Split([',']);
for i := Low(sa) to High(sa) do
begin
ComboBox1.Items.Add(sa[i]);
end;
ComboBox1.ItemIndex := 0;
end;
次に、GetConnectionNameListを呼び出してJSON形式の文字列を取得し、それをComboBox1に解析して追加します。
procedure TForm1.Button2Click(Sender: TObject);
var
s: string;
i: Integer;
jo: TJSONObject;
begin
s := c.Request('djwkQueryService', '1.0', 'GetConnectionNameList', ['json']); // JSON形式で返す
jo := TJSONObject.ParseJSONValue(s) as TJSONObject;
for i := 0 to jo.GetValue<TJSONArray>('data').Count - 1 do
begin
ComboBox1.Items.Add(jo.GetValue<TJSONArray>('data').Items[i].GetValue<String>('SessionName'));
end;
jo.Free;
end;
このメソッドは、JSON形式の文字列を返します。例:{"data":[{"SessionName":"hblexam","Description":""},{"SessionName":"djexam","Description":""}]}
これにより、kbmMW汎用サーバーKinglandSoftServerは、複数データベース機能をより柔軟に実現することができます。