線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2914
推到 Plurk!
推到 Facebook!

使用ADOQUERY,在UpdateBatch時,遇到查詢太過複雜

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-13 09:25:26 IP:61.31.xxx.xxx 未訂閱
各位前輩,小弟又來了... Orz 上次發問過為何會有這樣子的問題,那時Chance36 版大告訴我該加上 post.. 但是現在在資料為新增的狀態下,是沒問題的,但是,如果碰到為更新的狀態的話,還是會遇到這個問題,我把我的程式段放在下面,請各位前輩幫忙指導一下,感恩不盡... Orz p.s 以上說明的情況是指,同一份文件,在第一次進行轉檔時,可以順利轉入,而在重複一次這個文字檔的轉入時,就會遇到這種狀況。 if MessageDlg('轉檔?',mtConfirmation,[mbYes,mbNo],0)=mrYes then begin i:=1; ADOQuery2.Open; with ADOQuery1 do begin Active:=True; First; try while not eof do begin StatusBar1.Panels[0].Text:='²Ä' IntToStr(i 1) '/' IntToStr(ADOQuery1.RecordCount) '筆 資料處理中'; if ADOQuery2.Locate('Barcode',ADOQuery1.Fields[7].Value,[]) then ADOQuery2.Edit else ADOQuery2.Append; for i:=0 to fieldCount-1 do begin ADOQuery2.fields[i].value:=ADOQuery1.Field[i].value; end; ADOQuery2.Post; next; inc(i); end; ADOQuery2.UpdateBatch; finally StatusBar1.Panels[0].Text:=''; end; end; end; 努力學習中....
------
努力學習中....
eric039
中階會員


發表:57
回覆:126
積分:51
註冊:2002-11-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-13 10:46:59 IP:211.75.xxx.xxx 未訂閱
同樣的文件檔在第一次轉入時沒有問題,第二次轉入時會出現錯誤。 不知道錯誤的訊息到底是什麼,最好能夠把訊息也告知。 這樣看來應該不是程式錯誤吧! 您的 AdoQuery2 是不是有設定所謂的"主索引",造成您在寫入相同的資料時。 轉入相同的鍵值,造成的錯誤。 給您參考參考。 Eric Lin
------
Eric Lin
iann
一般會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-13 11:32:00 IP:61.31.xxx.xxx 未訂閱
eric039 大大.. 沒錯,我ADOQuery2 有設定 key... 但是,我所想做的,是更新的動作,而且,我程式段中,是先去搜尋該KEY 值 有找到的話,是針對該筆資料做修改的動作,並不是新增一筆新的阿.. orz 另外,我的錯誤訊息是 EOleException with message '查詢太過複雜。' 努力學習中....
------
努力學習中....
stillalive
初階會員


發表:7
回覆:148
積分:41
註冊:2004-04-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-14 10:45:20 IP:211.75.xxx.xxx 未訂閱
這位大大你好 試試看程式改成這樣 try while not eof do begin StatusBar1.Panels[0].Text:='²Ä' IntToStr(i 1) '/' IntToStr(ADOQuery1.RecordCount) '筆 資料處理中'; if ADOQuery2.Locate('Barcode',ADOQuery1.Fields[7].Value,[]) then ADOQuery2.Edit else ADOQuery2.Append; for i:=0 to fieldCount-1 do begin ADOQuery2.fields[i].value:=ADOQuery1.Field[i].value; end; next; inc(i); end; ADOQuery2.Post; // EXECUTE ONCE WHEN LOOP END ADOQuery2.UpdateBatch; finally StatusBar1.Panels[0].Text:=''; end; end; end;
iann
一般會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-16 09:07:03 IP:61.31.xxx.xxx 未訂閱
stillalive 大大你好..   我知道這樣寫,程序效率會比較好..   我原本也是這麼寫,那時是因為想說會不會是因為一次批次處理太多資料而發生這問題,所以才這樣改的,但事實證明不是 < > 試了那麼多天,還是找不到方法解決 < > 努力學習中....
------
努力學習中....
iann
一般會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-16 14:12:21 IP:61.31.xxx.xxx 未訂閱
各位大大..... 我一個朋友幫我測試出來了.. 是因為我的欄位數太多,我資料表的欄位有104個.. 經過簡化成98個之後,程式就能正常的RUN了.. 但是,我實在百思不解為啥會有這種情況.. 請知道答案的大大,幫忙解答一下吧.... Orz 努力學習中....
------
努力學習中....
stillalive
初階會員


發表:7
回覆:148
積分:41
註冊:2004-04-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-30 11:50:30 IP:211.75.xxx.xxx 未訂閱
iann 你好 據在下經驗 , DB2 欄位超出100個也會出問題 (使用RPG語言) , 用MS SQL 2000 欄位一多也會出問題 , 我的經驗是80多個時VFP無法處理 . 至於原因如何我不敢確定 , 可能是程式COMPILE時記憶體設定已超出 處理範圍 , 參考一下 . 發表人 - stillalive 於 2004/08/30 11:54:05
iann
一般會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-03 09:33:23 IP:61.31.xxx.xxx 未訂閱
stillalive 大大.. 您的意思是,我只要去調整記憶體設定,就可以搞定這個太多欄位的問題嗎? 我是用MDB的DATABASE,只要超過98,當同一個資料庫第二次去做更新時,就會碰到查詢太過複雜 我先去看有沒有的調整好了........ 努力學習中....
------
努力學習中....
stillalive
初階會員


發表:7
回覆:148
積分:41
註冊:2004-04-07

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-03 11:19:59 IP:211.75.xxx.xxx 未訂閱
iann 你好 其實你也不必費事去調整 PC 之記憶體設定 , 上述問題在下猜測是程式在 COMPILE 時對 欄位記憶體位址分配出問題 , 這純屬程式內部問題 , 你去調整外部記憶體是無效的 . 僅供參考
iann
一般會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-03 13:30:11 IP:61.31.xxx.xxx 未訂閱
stillalive 大大.. 小弟覺得,MDB 應該不會有這樣的限制,而DELIPHI應該也不會有這樣的問題.. 不然,資料表的欄位不能超過98,這似乎很怪.. 在我朋友那邊,也是一樣有這個情況.. 所以,可能不是我的電腦的問題.. 總不會這個問題無解吧..... Orz 努力學習中....
------
努力學習中....
stillalive
初階會員


發表:7
回覆:148
積分:41
註冊:2004-04-07

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-09-04 05:03:46 IP:211.75.xxx.xxx 未訂閱
奉勸一句話 , 如再堅持己見 , 閣下真不適合再呆此行 . PS . MDB 不是 DATABASE ,BY THE WAY , 閣下精神還是令人配服 . 發表人 - stillalive 於 2004/09/04 05:18:06
iann
一般會員


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-09-05 19:36:06 IP:211.76.xxx.xxx 未訂閱
stillalive 大大.. 小弟也沒堅持啥己見啊....(我根本不知道問題出在哪,何來己見.. ) 我只是想解決問題而已,想找出問題的解決方法.. 因為我不可能叫客戶永遠不能使用超過 > 努力學習中....
------
努力學習中....
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-09-07 23:04:58 IP:211.20.xxx.xxx 未訂閱
iann 你好
  當資料更新回資料庫時,若為新增的record時,Ado的Provider會產生一Insert的sql指令,如
Insert Into Tablename (Field1.....Field101) Value(:Value1....:Value101)然後帶入101個
參數值進去      但若為Update的狀況時,Ado的Provider會產生一Update的sql指令,如 Update Tablename 
Set Field1=:Value1,....Field101=:Value101 Where Field1=:Q1,...Field101=:Q101;
然後帶入202個新值及舊值當參數。      問題在上面紅色部份的Where條件,或許資料庫(Access)無法處理這麼多的條件子句,所以丟個[查
詢太過複雜。]訊息給你。      假設這個論述正確的話,我們就可以從調整Field.ProviderFlags屬性來著手,以減少Where條件子
句的複雜度,具體程式碼如下:
Var
  f:TField;
Begin
if MessageDlg('轉檔?',mtConfirmation,[mbYes,mbNo],0)=mrYes then begin
  ADOQuery2.Open;       // 新增這一段
  For i:=5 To AdoQuery2.FieldCount-1 Do Begin
    F := AdoQuery2.Fields[i];
    // 不是key欄位才要把pfInWhere 屬性值拿掉
    If Not (pfInKey IN F.ProviderFlags) Then 
      F.ProviderFlags := F.ProviderFlags - pfInWhere  ;
  End;
  // 改完之後 Update 的SQL變成(假設只有前5個欄位是Key欄位 )
  // Update Tablename Set Field1=:Value1,....Field101=:Value101 [red]Where Field1=:Q1,...Field101=:Q5;
  // 如此 Where 的條件子句只有 5個欄位的判斷式,而不是101個      i:=1;
  with ADOQuery1 do begin
    Active:=True;
    First;
    try
      while not eof do begin
        StatusBar1.Panels[0].Text:='²Ä' IntToStr(i 1) '/' IntToStr(ADOQuery1.RecordCount) '筆 資料處理中';
        if ADOQuery2.Locate('Barcode',ADOQuery1.Fields[7].Value,[]) then
          ADOQuery2.Edit
        else
          ADOQuery2.Append;
        for i:=0 to fieldCount-1 do begin
          ADOQuery2.fields[i].value:=ADOQuery1.Field[i].value;
        end;
        ADOQuery2.Post;
        next;
        inc(i);
      end;
      ADOQuery2.UpdateBatch;
    finally
      StatusBar1.Panels[0].Text:='';
    end;
  end;
end;
_______________________________________ 深藍的魚,祝您好運..........連連
iann
一般會員


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

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