对于使用mysql查询从数据库服务器im读取数据,如下所示:
FDQuery1.SQL.Text := 'select * from `table` WHERE dcid=3;';
FDQuery1.Open;
memo1.Lines.Add( FDQuery1.FieldByName('value').AsString );但是当我不得不使用循环从mysql读取数据时
我需要一个数组来读取和存储数据
我知道在php中它是这样的
$arr = array();
while($obj = $q->fetch_object() ){
$arr[] = $obj;
}但是如何在Delphi中实现这种语法呢?
发布于 2018-04-18 16:31:33
您不需要执行FDQuery1。首先,这在FDQuery1.Open中是隐含的。但是,如果您想知道您有多少记录,那么执行FDQuery1非常重要。最后,在使用FDQuery1.RecordCount获取真正的记录计数之前,您可能会得到奇怪的结果。
你需要做的就是把你的数据写进一份备忘录
FDQuery1.SQL.Text := 'select * from table WHERE dcid=3;';
memo1.Lines.clear;
FDQuery1.Open;
While not FDQuery1.Eof do
begin
memo1.Lines.Add( FDQuery1.FieldByName('value').AsString );
FDQuery1.next;
end;
end;
FDQuery1.Close;虽然使用最小异常处理的更好的解决方案是
FDQuery1.SQL.Text := 'select * from table WHERE dcid=3;';
memo1.Lines.clear;
try
try
begin
FDQuery1.Open;
While not FDQuery1.Eof do
begin
memo1.Lines.Add( FDQuery1.FieldByName('value').AsString );
FDQuery1.next;
end;
end;
end;
except
on E : Exception do
begin
showmessage ('Exception class name = '+E.ClassName+ slinebreak
+ 'Exception message = '+E.Message);
end //on E
end; //try-except
finally
FDQuery1.Close;
end; //try-finally你提到了一个数组。如果您只想将数据放在备忘录中,但是如果您确实希望将数据放入数组中(在设计时不知道需要多少记录元素、需要多少字段元素或每个字段的类型),则不需要这样做,那么您将使用以下代码。
(注意,这是故意不优化的代码,因为我试图使过程清楚)
Const
FirstRecordIndex = 0;
FirstFieldIndex = 0;
Var
DataArray : Variant;
TheRecordCount, TheFieldCount,
RecordNumber, FieldNumber : integer;
Data : variant;
begin
FDQuery1.SQL.Text := 'select * from table WHERE dcid=3;';
FDQuery1.Open;
FDQuery1.Last; //to get correct recordcount
TheRecordCount := FDQuery1.RecordCount;
TheFieldCount := FDQuery1.FieldCount;
FDQuery1.First; //go back to the beginning of the dataset
//set the dimensions of the 2D array of variants to hold data
DataArray := VarArrayCreate([FirstRecordIndex, TheRecordCount, FirstFieldIndex, TheFieldCount], varVariant ); //element can be of any type
//fill it
RecordNumber := -1; //initialise record indexe to just before the start
While not FDQuery1.Eof do
begin
inc(RecordNumber); //point to next record element in the array
for FieldNumber := FirstFieldIndex to TheFieldCount -1 do //load all the fields of this record
begin
Data := FDQuery1.Fields[FieldNumber].asVariant; //get the data
DataArray[RecordNumber, FieldNumber] := Data; //put into array
end;
FDQuery1.next; //get next record
end; //while
end;
FDQuery1.Close;
end;若要再次获取数据,请使用
For RecordNumber := FirstRecordIndex to TheRecordCount -1 do
For FieldNumber := FirstFieldIndex to TheFieldCount -1 do
begin
Data := DataArray[RecordNumber, FieldNumber] ;
//do something with the data ie put into a memo
end; 发布于 2018-04-18 15:42:29
你可以用这个,希望能帮到你:
FDQuery1.SQL.Text := 'select * from `table` WHERE dcid=3;';
FDQuery1.Open;
if FDQuery1.Active and (FDQuery1.RecordCount > 0) then
begin
FDQuery1.First;
While not FDQuery1.Eof do
begin
memo1.Lines.Add( FDQuery1.FieldByName('value').AsString );
FDQuery1.next;
end;
end;发布于 2018-04-18 18:15:28
您可以使用数组consept来完成这一任务。
首先,您必须创建新类型。
type
myArray = array [1..10] of integer;
myData= array of myArray;然后,必须定义变量。
var
Records: myData;
i:integer;,现在我们有了一个数组来保存数据库记录,所以
begin
FDQuery1.SQL.Text := 'select * from table WHERE type=3;';
FDQuery1.Open;
FDQuery1.First;
SetLength(Records ,FDQuery1.recordcount);//or maybe you need a do a select count(*) query first
i:=0;
While not FDQuery1.Eof do
begin
Records[i][1]:= FDQuery1.FieldByName('value1').AsString;
Records[i][2]:= FDQuery1.FieldByName('value2').AsString;
Records[i][3]:= FDQuery1.FieldByName('value3').AsString;
Records[i][4]:= FDQuery1.FieldByName('value4').AsString;
Records[i][5]:= FDQuery1.FieldByName('value5').AsString;
Records[i][6]:= FDQuery1.FieldByName('value6').AsString;
i:=i+1;
FDQuery1.next;
end;
FDQuery1.Close;
end;现在,您选择的所有数据库记录都在您的局部变量中,您可以遍历该行并使用FDQuery1进行新的查询.
https://stackoverflow.com/questions/49870695
复制相似问题