全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1891
推到 Plurk!
推到 Facebook!

將資料庫欄位資料,存入陣列中

尚未結案
goodjimmy
一般會員


發表:20
回覆:26
積分:9
註冊:2004-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-01 22:53:37 IP:60.198.xxx.xxx 未訂閱
各位大大:     小弟多月沒上來post問題,請教各位,如何將資料庫的欄位資料,存入動態陣列中呢??
var i:Integer;
    rule:array of char;      DataModule2.ADOQuery1.Close;
  DataModule2.ADOQuery1.SQL.Clear;
  DataModule2.ADOQuery1.SQL.Text:='Select * from ecdb where GP=1';//約有10個欄位
  DataModule2.ADOQuery1.Open;
  Label1.Caption:='資料筆數共' IntToStr(Datamodule2.DataSource1.DataSet.RecordCount) '筆';
  DataModule2.ADOQuery1.First;
  while not DataModule2.ADOQuery1.EOF do
    begin
    for i := 0 to DataModule2.ADOQuery1.FieldCount - 1 do begin
          rule[i]:=DataModule2.ADOQuery1.Fields[3].FieldName;//此行不知如何把資料放一筆一筆放入陣列中(選擇某一欄位資料)
    end;
    DataModule2.ADOQuery1.Next;
  end;
還有第二個問題是?如果日後我有需要擴充,多增加幾個欄位資料,逐一存入各別的陣列,該如何編寫程式呢??感謝各位的觀看~~ 耐的住被人磨,則會像鑽石一樣發光
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-01 23:21:06 IP:61.71.xxx.xxx 未訂閱
第一個問題, 有非常多的方法 例一, 利用 record 宣告
type
   TaryRec= Record
    field1: string;
    field2: string;
    filed3: integer;
end;
.....    private
....        impletement    procedure ....
   var fname: string;
       aryRec: array of TaryRec;
begin
   // 指定陣列長度
   setlength(aryRec,Datamodule2.DataSource1.DataSet.RecordCount);      while not DataModule2.ADOQuery1.EOF do
    begin
    for i := 0 to DataModule2.ADOQuery1.FieldCount - 1 do begin
        fname:= DataModule2.ADOQuery1.Fields[i].Feildname;
        if fname='field1' then 
          aryRec[i].field1:=DataModule2.ADOQuery1.FieldsbyName(fname).Value
        else if fname='field2' then 
          aryRec[i].field2:=DataModule2.ADOQuery1.FieldsbyName(fname).Value
.... 依此類推(這是最基本型寫法)
    end;
    DataModule2.ADOQuery1.Next;
  end;    end;    例二, 利用 二維陣列 宣告
[code]
private
....    impletement    procedure ....
   var fname: string;
       aryRec: array of array of string;
       j: integer
begin
   // 指定陣列長度
   setlength(aryRec,Datamodule2.DataSource1.DataSet.RecordCount,10); // 10假設10個欄位
  j:= 0;
  while not DataModule2.ADOQuery1.EOF do
    begin
    for i := 0 to DataModule2.ADOQuery1.FieldCount - 1 do begin
        fname:= DataModule2.ADOQuery1.Fields[i].Feildname;
          aryRec[j][i]:=DataModule2.ADOQuery1.FieldsbyName(fname).AsString;
    end;
    DataModule2.ADOQuery1.Next;
    inc(j);
  end;    end;    
這兩種寫法都可以把field值填入到陣列中, 差別是Record方式可以比較清楚對應每一個欄位型態, 因為你已經宣告 field1, field2分屬那類型態, 然後對應到資料庫的field1, field2, 容易維護 採用二維陣列, 由於宣告成字串, 所以不屬字串結構必須透過AsString轉換成string才能存入陣列中, 但這如果TDateTime, boolean, graphic 等模式就很難控制了, 可是這樣的寫法是能夠比較精簡, 不過不代表第一例就不能精簡哦! 還有要存入方式也可以用TStringList, TMemo, TStringGrid 等都能做得到, 只看你要做這樣的行為設計目的何在, 然後再挑選一種最恰當的做法來執行! 第二個問題, 參照第一個問題再改就好了 發表人 - P.D. 於 2005/08/01 23:31:09
goodjimmy
一般會員


發表:20
回覆:26
積分:9
註冊:2004-02-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-02 14:15:11 IP:163.28.xxx.xxx 未訂閱
呵呵呵,雖然改了一些語法和結構,不過還是感謝p大的程式靈感    我修改的程式碼如下
 DataModule2.ADOQuery1.First;
     setlength(aryRec,Datamodule2.DataSource1.DataSet.RecordCount);       for i := 0 to DataModule2.ADOQuery1.FieldCount - 1 do begin
      fname:= DataModule2.ADOQuery1.Fields[i].Fieldname;
      if fname='sex' then begin
       for j:= 0 to Datamodule2.DataSource1.DataSet.RecordCount-1 do begin                                                                                                                                             if fname='sex' then
        aryRec[j].field1:=DataModule2.ADOQuery1.FieldbyName(fname).Value;
        DataModule2.ADOQuery1.Next;
       end;
      end
      else if fname='age' then
      begin
         DataModule2.ADOQuery1.First;
         for j:= 0 to Datamodule2.DataSource1.DataSet.RecordCount-1 do begin
         aryRec[j].field2:=DataModule2.ADOQuery1.FieldbyName(fname).Value;
         DataModule2.ADOQuery1.Next;
         end;
      end;
   end;
耐的住被人磨,則會像鑽石一樣發光
系統時間:2024-06-02 1:09:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!