为了说清楚,我不想将整个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数组似乎并不简单。
答案 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;
您可以轻松地对其进行修改,以按原样从数据集中加载具有名称和类型的字段。