首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >delphi mysql查询结果

问delphi mysql查询结果
EN

Stack Overflow用户
提问于 2018-04-17 05:45:10
回答 3查看 2K关注 0票数 0

对于使用mysql查询从数据库服务器im读取数据,如下所示:

代码语言:javascript
复制
FDQuery1.SQL.Text := 'select * from `table` WHERE dcid=3;';
FDQuery1.Open;
memo1.Lines.Add( FDQuery1.FieldByName('value').AsString );

但是当我不得不使用循环从mysql读取数据时

我需要一个数组来读取和存储数据

我知道在php中它是这样的

代码语言:javascript
复制
$arr = array();
while($obj = $q->fetch_object() ){
    $arr[] = $obj;
}

但是如何在Delphi中实现这种语法呢?

EN

回答 3

Stack Overflow用户

发布于 2018-04-18 16:31:33

您不需要执行FDQuery1。首先,这在FDQuery1.Open中是隐含的。但是,如果您想知道您有多少记录,那么执行FDQuery1非常重要。最后,在使用FDQuery1.RecordCount获取真正的记录计数之前,您可能会得到奇怪的结果。

你需要做的就是把你的数据写进一份备忘录

代码语言:javascript
复制
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;

虽然使用最小异常处理的更好的解决方案是

代码语言:javascript
复制
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

你提到了一个数组。如果您只想将数据放在备忘录中,但是如果您确实希望将数据放入数组中(在设计时不知道需要多少记录元素、需要多少字段元素或每个字段的类型),则不需要这样做,那么您将使用以下代码。

(注意,这是故意不优化的代码,因为我试图使过程清楚)

代码语言:javascript
复制
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;

若要再次获取数据,请使用

代码语言:javascript
复制
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; 
票数 2
EN

Stack Overflow用户

发布于 2018-04-18 15:42:29

你可以用这个,希望能帮到你:

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2018-04-18 18:15:28

您可以使用数组consept来完成这一任务。

首先,您必须创建新类型。

代码语言:javascript
复制
type
  myArray = array [1..10] of integer;
  myData= array of myArray;

然后,必须定义变量。

代码语言:javascript
复制
var
  Records: myData;
  i:integer;

,现在我们有了一个数组来保存数据库记录,所以

代码语言:javascript
复制
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进行新的查询.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49870695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档