很多时候,当我们查询数据库时,我们只需要一列varchar。
因此,我为查询数据库并将结果放入字符串列表做了一个很好的功能:
function Getdatatostringlist(sqlcomponent, sqlquery: string): TStringlist;
我现在正在寻找的功能基本上是相同的,但是对于具有多列的结果,您事先不知道数据是什么类型,即varchar,int,datetime。
在这里使用哪种数据结构会很好。
我想要这样做的原因是,我尝试不使用开放数据集。我更喜欢将所有结果提取到临时结构中,关闭数据集并处理结果。
在Kobiks答复了有关在内存数据集中使用的信息后,我提出了以下内容,可以快速将其组合起来以测试这一概念:
procedure TForm1.Button2Click(Sender: TObject);
var
MyDataSet : TAdoDataSet;
begin
MyDataSet := GetDataToDataSet('SELECT naam FROM user WHERE userid = 1', ADOConnection1);
try
Form1.Caption := MyDataSet.FieldByName('naam').AsString;
finally
MyDataSet.free;
end;
end;
function TForm1.GetDataToDataSet(sSql: string; AdoConnection: TADOConnection): TAdoDataSet;
begin
Result := TAdoDataSet.Create(nil);
Result.LockType := ltBatchOptimistic;
Result.Connection := AdoConnection;
Result.CommandText := sSql;
Result.Open;
Result.Connection := nil;
end;
我认为这是可以建立的。
最佳答案
您应该使用任何断开连接的内存TDataSet
后代,例如TClientDataSet
。
不要通过在新的“ Variant”结构中存储记录集来尝试重新发明轮子。 TClientDataSet
已经包含操作“临时”数据结构所需的所有功能。
这是创建TClientDataSet
结构的方法:
cds.FieldDefs.Add('id', ftInteger);
cds.FieldDefs.Add('name', ftString, 100);
// ...
// create it
cds.CreateDataSet;
// add some data records
cds.AppendRecord([1, 'Foo']);
cds.AppendRecord([2, 'Bar']);
许多TDataSet可以根据提供者和
LockType
用作内存(客户端)数据集,例如,带有TADODataSet
的LockType=ltBatchOptimistic
可以从服务器获取结果集,然后保持断开连接。关于sql - 数据库结果的可变结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15572300/