將資料庫欄位資料,存入陣列中 |
尚未結案
|
goodjimmy
一般會員 發表:20 回覆:26 積分:9 註冊:2004-02-19 發送簡訊給我 |
各位大大:
小弟多月沒上來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 發送簡訊給我 |
第一個問題, 有非常多的方法
例一, 利用 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 發送簡訊給我 |
呵呵呵,雖然改了一些語法和結構,不過還是感謝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;耐的住被人磨,則會像鑽石一樣發光 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |