如何结合来自不同数据库的数据?

hor*_*rgh 11 sql sql-server delphi bde delphi-7

我想到了从不同的数据库中联合两个选择的必要性,即paradox(在bde中)和ms sql server.

目前bde(through TQuery)仅用于程序的这一部分(即dbgrid).现在我需要将存储在ms sql server数据库中的一些数据(我通常使用它TADOQuery)添加到同一个网格中.

虽然查询是在完全不同的表上执行的,但是列的结果集的命名和输入类似(我的意思是,如果我有这些表,比如说,在ms sql server数据库中,我可以使用一个简单的联合).

有没有办法在delphi7中统一从这些中选择的记录集,我可以将结果用作dbgrid的数据源?

bum*_*mmi 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;
Run Code Online (Sandbox Code Playgroud)

另一个尝试可能是为paradox创建一个链接服务器,我没试过......

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