有没有更好的方法将记录从TSQLQuery复制到TdxMemData?

时间:2015-03-11 21:15:50

标签: sql delphi devexpress

为了说清楚,我不想将整个TSQLQuery复制到TdxMemData中,因为我会使用memds.CopyFromDataSet(qry)。

我正在通过TSQLQuery中的每个记录进行交互,我可能会也可能不会在TdxMemData中添加记录。通常,memds中的记录与qry中的记录匹配,但有时会更改值,有时会向memd添加其他记录。我的例子没有说清楚,因为它似乎只是复制每条记录。

因此,如果在TSQLQuery中有一个活动记录,我想将值复制到TdxMemData中的活动可编辑记录中。

以下代码可用于创建记录的副本:

qry := TSQLQuery.Create(nil);
memds := TdxMemData.Create(nil);

try
  qry.SQLConnection := cn;
  qry.Text := 'SELECT Field1, Field2, Field3 FROM Table1';
  qry.Open

  memds.CreateFieldsFromDataSet(qry);
  memds.Open;

  while not qry.Eof do
  begin
    if {some condition} then
    begin
      memds.Append;

      for i := 0 to qry.FieldCount-1 do
        memds.Fields[i+1].Value := qry.Fields[i].Value; //First field is RecID

      //Do something with the current memds record
    end
    else if {some other condition} then
    begin
      memds.Append;
      //change values
      memds.Append;
      //change values
      memds.Append;
      //change values
    end
    else if {a third condition} then
      ; //Skip any work on memds
    qry.next;
  end;

  qry.Close;

  //Do something with memds

  memds.Close;
finally
  memds.Free;
  qry.Free;
end;

有更好的方法吗?我看过AppendRecord但是创建TVarRec数组似乎并不简单。

3 个答案:

答案 0 :(得分:0)

尝试以下

  Query1.Open();
  dxMemData1.AddFieldsFromDataSet(Query1);
  dxMemData1.Open;
  dxMemData1.LoadFromDataSet(Query1);

答案 1 :(得分:0)

创建TVarRec数组并不困难,AppendRecord可能确实有帮助。以下代码将记录添加到TClientDataSet(简称为CDS),该记录有4个字段,类型为string,float,boolean和string,顺序如下:

CDS.AppendRecord(['Smith', 123.45, False, 'Test text']);

请注意,您必须按照FieldDefs集合中存在的顺序为数据集中的每个字段(列)创建一个值,否则您将获得例外。

(当然,真正的问题是为什么你要返回额外的行并迭代它们,而不是测试SQL语句WHERE子句中的条件,只返回你实际需要的行。这几乎可以总是使用参数完成。)

答案 2 :(得分:0)

如果您不想使用AddFieldsFromDataSet-> LoadFromDataSet,并且想要手动加载字段和记录,则也可以这样做。您可以以编程方式创建字段并通过迭代附加记录。看例子:

MD.Fields.Clear;
MD.FieldDefs.Clear;
MD.Close;

with MD.FieldDefs.AddFieldDef do
begin
  Name := 'UserID';
  DataType := TFieldType.ftInteger;
  CreateField(MD);
  Name := 'GridName';
  DataType := TFieldType.ftString;
  Size := 255;
  CreateField(MD);
  Name := 'TemplateGrid';
  DataType := TFieldType.ftBlob;
  CreateField(MD);
end;

MD.Close;
MD.Open;

MD.Append;

MD.FieldByName('UserID').AsInteger := 1;
MD.FieldByName('GridName').AsString := Self.Name
TBlobField(MD.FieldByName('TemplateGrid')).LoadFromStream(LStream);
MD.Post;

您可以轻松地对其进行修改,以按原样从数据集中加载具有名称和类型的字段。