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

使用ADOTABLE + ADOQUERY 的更新資料表問題

答題得分者是:Chance36
iann
一般會員


發表:17
回覆:31
積分:14
註冊:2003-08-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-02 15:38:18 IP:61.31.xxx.xxx 未訂閱
各位先進 小弟目前碰到一個困難,要麻煩大家提供一下意見.. 我要將一個文字檔的內容放進我的資料庫內,那麼,抓取文字檔至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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-03 01:33:19 IP:203.204.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-04 18:08:43 IP:61.31.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-04 19:15:04 IP:203.204.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-05 08:47:56 IP:61.31.xxx.xxx 未訂閱
Chance36 版大~~~ 多謝您了,果然是這個問題。 努力學習中....
------
努力學習中....
系統時間:2024-06-29 11:24:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!