我遇到了从不同数据库中联合两个选择的必要性,即paradox(在bde中)和ms sql server。
目前bde(通过TQuery
)仅用于程序的这一部分(即dbgrid)。现在我需要将存储在ms sql server数据库中的一些数据(我通常使用TADOQuery
)添加到同一网格中。
尽管查询是在完全不同的表上执行的,但是列的结果集的命名和输入类似(我的意思是,如果我有这些表,比如说,在ms sql server数据库中,我可以使用一个简单的联合)。
有没有办法在delphi7中统一从这些中选择的记录集,我可以将结果用作dbgrid的数据源?
答案 0 :(得分: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;
另一种尝试可能是为paradox创建一个链接服务器,我没试过......
http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/SQL_Server_2008/Q_24067488.html
答案 1 :(得分:4)
AnyDAC LocalSQL没问题。您可以使用任何DataSet执行SQL,不仅可以选择SQL,插入,更新,删除SQL。
答案 2 :(得分:3)
您可以使用内置的 TClientDataSet 功能通过将第二个数据集中的数据附加到第一个数据集的数据来合并数据。
有不同的方法可以做到这一点,我首选的方法是因为简单的代码是添加两个DataSetProviders并将其链接到每个DataSet,例如
dspBDE.DataSet := MyTQuery;
dspADO.DataSet := MyAdoQuery;
然后,要打开您的DataSet,您可以这样做:
MyClientDataSet.Data := dspBDE.Data;
MyClientDataSet.AppendData(dspADO.Data, True);
要使其工作,两个DataSet都必须匹配字段编号和数据类型。由于您的结构类似,因此如果不自动发生,您可以在SQL中进行类型转换。
答案 3 :(得分:0)
几年前(Delphi 7)我使用了TxQuery,但我不知道它是否还在开发中
我找到了这个link