sql - 数据库结果的可变结构

标签 sql delphi

很多时候,当我们查询数据库时,我们只需要一列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/

相关文章:

Delphi - 如何处理多个 except 类型

sql - 如何优化以下查询

java - 插入mysql表时出现异常

sql - 如何在同一个 SQL 表中的两行之间执行按位或运算?

MYSQL - 按另一个表对一个表进行排序

delphi - 匿名方法生成什么样的元数据?有没有办法删除它?

mysql - 计算 View 中两个数据库之间具有偏移量的时间戳

string - Delphi 2007 中对多维数组进行排序

delphi - OpenGL 快速闪烁问题 - 现在不显示图像

database - 数据库连接的良好实践