使用ADOTABLE + ADOQUERY 的更新資料表問題 |
答題得分者是:Chance36
|
iann
一般會員 發表:17 回覆:31 積分:14 註冊:2003-08-30 發送簡訊給我 |
各位先進
小弟目前碰到一個困難,要麻煩大家提供一下意見..
我要將一個文字檔的內容放進我的資料庫內,那麼,抓取文字檔至TABLE
的這一段,我沒問題。有問題的部分是,因為此TABLE是產品資料,那麼會一直有新的文字檔進來,是新的貨號,則要新增,如是舊的貨號,則使用更新的方式。(資料庫是access)
我目前的想法,是採用兩個資料表,一個是放資料的,一個是只有結構而已。用 ADOQuery DBGrid 來將文字檔內容抓進 DBGrid,使用ADOTable 來開啟另外一個真正存放資料的TABLE。按下存檔的時候,再將DBGrid 的內容更新到TABLE去。
目前碰到的問題點是,我所查到能用的有兩個方式,一是使用SQL 的指令來做,但是一直寫不成功,所以只好改用迴圈來跑下面這一行指令
ADOTable1.Fields[j].AsString:=DBGrid1.DataSource.DataSet.Fields[j].AsString;
但是,也出現錯誤訊息,說 ADOTable 不是在 edit 的狀態下,但我在前面已經有寫 ADOTable.edit 了...
另外,因為我的FIELDS超過百個..所以,不想使用fieldbyname 的方式來寫
麻煩各位先進提供一下意見.. thanks.. 努力學習中....
------
努力學習中.... |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
iann 你好
參考下列程式片段 Var i : Integer ; fName : String; Begin With DBGrid1.DataSource.DataSet Do begin // 搜尋是否有相同Key的記錄,若無則新增,若有則Edit; If ADOTable1.Locate('K1;K2.....' ,VararrayOf([FieldByName('K1').AsString ,FieldByName('K2').AsString,....]) ,[]) Then ADOTable1.Append Else ADOTable1.Edit; // 可改成別的方式來尋找相同的記錄 For i:= 0 To Fields.Count-1 Do Begin // fName := Fields[i].FieldName ; If ADOTable1.FindField(fName)<> nil Then // 確定AdoTable1有相同的欄位名稱才會寫入 ADOTable1.FieldByName(fName).AsString := Fields[i].AsString ; End; ADOTable1.Post ; End; PS:附帶一提,針對[用 ADOQuery DBGrid 來將文字檔內容抓進 DBGrid],即然 是臨時暫存的資料,你可以改用TClientDataSet來存放,待確定後要存入資料庫時,同樣使用上述方法存入,如此效率會比較好。_______________________________________ 深藍的魚,祝您好運..........連連 發表人 - chance36 於 2004/08/03 01:39:53 |
iann
一般會員 發表:17 回覆:31 積分:14 註冊:2003-08-30 發送簡訊給我 |
Chance36 版大您好~~
小弟試著去寫了,是可以RUN,沒有問題..
但是碰到一個狀況,我在執行下面這一行的時候,偶而會碰到查詢太複雜
ADOQuery2.UpdateBatch;
然後,資料就寫不進去的狀況。
我的寫法如下
if ADOQuery2.Locate('Barcode',ADOQuery1.Fields[7].Value,[]) then
ADOQuery2.Edit
else
ADOQuery2.Append;
for i:=0 to fieldCount-1 do
ADOQuery2.fields[i].value:=ADOQuery1.Fields[i].value;
ADOQuery2.UpdateBatch; 還是,我應該改為用您的POST 的方式來寫會比較好?? 努力學習中....
------
努力學習中.... |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
iann 你好
if ADOQuery2.Locate('Barcode',ADOQuery1.Fields[7].Value,[]) then ADOQuery2.Edit else ADOQuery2.Append; for i:=0 to fieldCount-1 do ADOQuery2.fields[i].value:=ADOQuery1.Fields[i].value; ADOQuery2.Post; // 這一定要加的 ADOQuery2.UpdateBatch; // 而這行是當ADOQuery2.LockType=ltBatchOptimistic時 才需要加的 PS: ADOQuery2.LockType不是ltBatchOptimistic時,即是一般的即時更新的處理模 式,針對資料集從Edit或Append開始資料的寫入,而Post代表資料寫入完成後即 同步寫到後端資料庫了。 然而ADOQuery2.LockType=ltBatchOptimistic時,代表用批次更新的處理模式, 同樣從Append或Edit開始資料的寫入(新增或修改),在Post之後完成寫入,但是只 寫入到ADOQuery的記憶體緩衝,並未真正寫入到後端資料庫,必須再下個指令 (BatchUpdate)才會將剛才的異動真正的寫入後端資料庫。_______________________________________ 深藍的魚,祝您好運..........連連 |
iann
一般會員 發表:17 回覆:31 積分:14 註冊:2003-08-30 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |