我遇到了必须合并来自不同数据库的两个选择的必要性,即悖论(在bde中)和ms sql服务器。
目前,bde(通过TQuery
)仅在程序的这一部分(即dbgrid)中使用。现在,我需要将存储在ms sql服务器数据库(通常使用TADOQuery
)中的一些数据添加到同一网格中。
尽管查询是在完全不同的表上执行的,但列的结果集的命名和输入方式却类似(我的意思是,如果我有这些表,例如在ms sql server数据库中,我可以为此使用平凡的联合)。
有什么方法可以将在delphi7中从这些记录集中选择的记录集组合在一起,以便我可以将结果用作dbgrid的数据源?
最佳答案
您可以使用由eg的定义创建的clientdataset。 SQL-Server数据集的数据集,并添加悖论数据集的数据。 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