很多时候,当我们查询数据库时,我们只需要一列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用作内存(客户端)数据集,例如,带有TADODataSetLockType=ltBatchOptimistic可以从服务器获取结果集,然后保持断开连接。

关于sql - 数据库结果的可变结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15572300/

10-13 08:12
查看更多