複数データベースアクセスをサポートするQueryServiceの実装

サーバー側で複数のデータベースを定義し、クライアント側から「接続名」と「クライアントサービス名」を使ってこれらのデータベースにアクセスすることを考えます。

ここでは、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は、複数データベース機能をより柔軟に実現することができます。

タグ: kbmMW MultiDBQueryService データベースアクセス JSON TJSONObject

7月3日 20:19 投稿