繁体   English   中英

delphi mysql查询结果

[英]delphi mysql query result

使用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中执行此语法?

您不需要执行FDQuery1.First,因为这在FDQuery1.Open中是隐式的。 但是,如果您想知道有多少条记录,那么执行FDQuery1.Last;很重要。 在使用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; 

您可以使用此功能,希望对您有所帮助:

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;

你可以用数组概念数组来做到这一点

首先,您必须创建新类型

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进行新查询...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM