我怎样才能一次从 TDataSet 中读取整条记录?
How can I read a whole record at once from a TDataSet?
我正在使用查询(实际上是 Devart 的 TMyQuery,继承自 TDataSet)从 mySQL 数据库中获取数据。通常我使用 fieldbyname()
在 while not eof
循环中一次处理一个字段。
由于某些处理过程很复杂,所以我想取而代之的是获取整个记录并将其传递给一个过程,以便在循环之外对每个字段进行处理。
我认为这可能与 GetCurrentRecord()
方法有关,如果它被覆盖,该方法似乎 return 指向 Byte 的指针,但我不清楚如何从中提取我的字段指针。
如果可以的话,谁能告诉我获取一整条记录的语法,将其作为参数传递,然后提取每个字段?
我常用的代码结构
Procedure ProcessTable;
begin
Query1.SQL.Clear;
Query1.SQL.Add(SQL);
Query1.Open;
Query1.first ;
while not Query1.Eof do
begin
var1 := Query1.FieldByName('field1').AsString;
var2 := Query1.FieldByName('field2').AsInteger;
//etc.
Query1.Next;
end;
Query1.close;
end;
我想做的伪代码
procedure ProcessRecord( TheRecord : PByte );
begin
..
<extract the fields from TheRecord and process them>
..
end;
Procedure ProcessTable;
var
buffer : PByte;
begin
Query1.SQL.Clear;
Query1.SQL.Add(SQL);
Query1.Open;
Query1.first ;
while not Query1.Eof do
begin
buffer := Query1.GetCurrentRecord;
ProcessRecord(buffer);
Query1.Next;
end;
Query1.close
end;
解决方案不是尝试传递指向包含相关记录的缓冲区的指针,而是传递整个查询对象。然后可以像往常一样简单地使用 FieldByName() 恢复相关记录。查询对象中包含当前指向的记录的位置,因此它不需要先提取到缓冲区中。
所以使用相同伪代码的解决方案是。
procedure ProcessRecord( TheRecord : TQuery );
var
var1 : string;
var2 : integer;
begin
var1 := TheRecord .FieldByName('field1').AsString;
var2 := TheRecord .FieldByName('field2').AsInteger;
<process var1 and var 2>
end;
Procedure ProcessTable;
begin
Query1.SQL.Clear;
Query1.SQL.Add(SQL);
Query1.Open;
Query1.first ;
while not Query1.Eof do
begin
ProcessRecord(Query1); //pass the whole query object as type TQuery
//(or in my specific case, of type TmyQuery Query1.Next;
end;
Query1.close
end;
我正在使用查询(实际上是 Devart 的 TMyQuery,继承自 TDataSet)从 mySQL 数据库中获取数据。通常我使用 fieldbyname()
在 while not eof
循环中一次处理一个字段。
由于某些处理过程很复杂,所以我想取而代之的是获取整个记录并将其传递给一个过程,以便在循环之外对每个字段进行处理。
我认为这可能与 GetCurrentRecord()
方法有关,如果它被覆盖,该方法似乎 return 指向 Byte 的指针,但我不清楚如何从中提取我的字段指针。
如果可以的话,谁能告诉我获取一整条记录的语法,将其作为参数传递,然后提取每个字段?
我常用的代码结构
Procedure ProcessTable;
begin
Query1.SQL.Clear;
Query1.SQL.Add(SQL);
Query1.Open;
Query1.first ;
while not Query1.Eof do
begin
var1 := Query1.FieldByName('field1').AsString;
var2 := Query1.FieldByName('field2').AsInteger;
//etc.
Query1.Next;
end;
Query1.close;
end;
我想做的伪代码
procedure ProcessRecord( TheRecord : PByte );
begin
..
<extract the fields from TheRecord and process them>
..
end;
Procedure ProcessTable;
var
buffer : PByte;
begin
Query1.SQL.Clear;
Query1.SQL.Add(SQL);
Query1.Open;
Query1.first ;
while not Query1.Eof do
begin
buffer := Query1.GetCurrentRecord;
ProcessRecord(buffer);
Query1.Next;
end;
Query1.close
end;
解决方案不是尝试传递指向包含相关记录的缓冲区的指针,而是传递整个查询对象。然后可以像往常一样简单地使用 FieldByName() 恢复相关记录。查询对象中包含当前指向的记录的位置,因此它不需要先提取到缓冲区中。
所以使用相同伪代码的解决方案是。
procedure ProcessRecord( TheRecord : TQuery );
var
var1 : string;
var2 : integer;
begin
var1 := TheRecord .FieldByName('field1').AsString;
var2 := TheRecord .FieldByName('field2').AsInteger;
<process var1 and var 2>
end;
Procedure ProcessTable;
begin
Query1.SQL.Clear;
Query1.SQL.Add(SQL);
Query1.Open;
Query1.first ;
while not Query1.Eof do
begin
ProcessRecord(Query1); //pass the whole query object as type TQuery
//(or in my specific case, of type TmyQuery Query1.Next;
end;
Query1.close
end;