11

paradox (bde) と ms sql server という異なるデータベースからの 2 つの選択を結合する必要があることに気付きました。

現在、bde (を介してTQuery) は、プログラムのこの部分 (つまり dbgrid) でのみ使用されます。ここで、ms sql サーバー データベース (通常は を使用しますTADOQuery) に保存されているデータを同じグリッドに追加する必要があります。

クエリは完全に異なるテーブルに対して実行されますが、列の結果セットは同様に名前が付けられ、型が付けられます (つまり、これらのテーブルが ms sql サーバー データベースにある場合、自明なユニオンを使用できます)。

これらから選択したレコードセットを delphi7 で結合して、結果を dbgrid のデータ ソースとして使用できる方法はありますか?

4

5 に答える 5

5

たとえばの定義によって作成された clientdataset を使用できます。SQL-Server データセットのデータセットを変更し、paradox データセットのデータを追加します。あなたの場合、 TFieldDefArray は空にすることができます。

type
  TMyFieldDef = Record
    Name: String;
    Size: Integer;
    DataType: TFieldType;
  end;

  TFieldDefArray = array of TMyFieldDef;


function GetClientDSForDS(ADataSet: TDataSet; AFieldDefArray: TFieldDefArray; AClientDataSet: TClientDataSet = nil; WithRecords: Boolean = true)
  : TClientDataSet;
var
  i: Integer;
  Function NoAutoInc(ft: TFieldType): TFieldType;
  begin
    if ft = ftAutoInc then
      Result := ftInteger
    else
      Result := ft;
  end;

begin

  if Assigned(AClientDataSet) then
    Result := AClientDataSet
  else
    Result := TClientDataSet.Create(nil);
  Result.Close;
  Result.FieldDefs.Clear;

  for i := 0 to ADataSet.FieldCount - 1 do
  begin
    Result.FieldDefs.Add(ADataSet.Fields[i].FieldName, NoAutoInc(ADataSet.Fields[i].DataType), ADataSet.Fields[i].Size);
  end;

  for i := 0 to High(AFieldDefArray) do
    Result.FieldDefs.Add(AFieldDefArray[i].Name, AFieldDefArray[i].DataType, AFieldDefArray[i].Size);

  Result.CreateDataSet;
  for i := 0 to ADataSet.FieldCount - 1 do
  begin
    Result.FieldByName(ADataSet.Fields[i].FieldName).DisplayLabel := ADataSet.Fields[i].DisplayLabel;
    Result.FieldByName(ADataSet.Fields[i].FieldName).Visible := ADataSet.Fields[i].Visible;
  end;

  if WithRecords then
  begin
    ADataSet.First;
    while not ADataSet.Eof do
    begin
      Result.Append;
      for i := 0 to ADataSet.FieldCount - 1 do
      begin
        Result.FieldByName(ADataSet.Fields[i].FieldName).Assign(ADataSet.Fields[i]);
      end;
      Result.Post;
      ADataSet.Next;
    end;
  end;
end;

別の試みは、パラドックス用のリンクサーバーを作成することかもしれませんが、私はそれを試みませんでした...

http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/SQL_Server_2008/Q_24067488.html

于 2012-12-19T07:36:15.750 に答える
4

AnyDAC LocalSQLに問題はありません。SQL を選択するだけでなく、SQL を挿入、更新、削除するだけでなく、任意の DataSet で SQL を実行できます。

于 2012-12-19T13:24:52.340 に答える
3

組み込みのTClientDataSet機能を使用して、2 番目のデータセットのデータを最初のデータセットのデータに追加することにより、データを結合できます。

それにはさまざまな方法がありますが、私の好みの方法は、単純なコードで 2 つの DataSetProvider を追加し、それを各 DataSet にリンクすることです。たとえば、

dspBDE.DataSet := MyTQuery;
dspADO.DataSet := MyAdoQuery;

次に、DataSet を開くには、次のようにします。

MyClientDataSet.Data := dspBDE.Data;
MyClientDataSet.AppendData(dspADO.Data, True);

これを機能させるには、両方の DataSet がフィールド番号とデータ型に一致する必要があります。構造が似ているため、これが自動的に行われない場合は、SQL で型キャストすることで作業できます。

于 2012-12-19T15:04:33.403 に答える
2

BDE は異種クエリをサポート (またはサポート) します。これにより、クエリを複数のデータセットにまたがることができますが、SQL 構文は制限されます。

IIRC 私は 10 年以上前にいくつかの簡単なデータマージに使用しましたが、詳細を思い出せません。BDE には何年も触れていません。

于 2012-12-19T10:27:15.160 に答える
0

数年前 (Delphi 7) 私は TxQuery を使用しましたが、まだ開発中かどうかはわかりません

このリンクを見つけました

于 2012-12-19T09:19:16.397 に答える