使用ADOQUERY,在UpdateBatch時,遇到查詢太過複雜 |
答題得分者是:Chance36
|
iann
一般會員 ![]() ![]() 發表:17 回覆:31 積分:14 註冊:2003-08-30 發送簡訊給我 |
各位前輩,小弟又來了... 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 發送簡訊給我 |
|
iann
一般會員 ![]() ![]() 發表:17 回覆:31 積分:14 註冊:2003-08-30 發送簡訊給我 |
|
stillalive
初階會員 ![]() ![]() 發表:7 回覆:148 積分:41 註冊:2004-04-07 發送簡訊給我 |
這位大大你好 試試看程式改成這樣
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 發送簡訊給我 |
|
iann
一般會員 ![]() ![]() 發表:17 回覆:31 積分:14 註冊:2003-08-30 發送簡訊給我 |
|
stillalive
初階會員 ![]() ![]() 發表:7 回覆:148 積分:41 註冊:2004-04-07 發送簡訊給我 |
|
iann
一般會員 ![]() ![]() 發表:17 回覆:31 積分:14 註冊:2003-08-30 發送簡訊給我 |
|
stillalive
初階會員 ![]() ![]() 發表:7 回覆:148 積分:41 註冊:2004-04-07 發送簡訊給我 |
|
iann
一般會員 ![]() ![]() 發表:17 回覆:31 積分:14 註冊:2003-08-30 發送簡訊給我 |
|
stillalive
初階會員 ![]() ![]() 發表:7 回覆:148 積分:41 註冊:2004-04-07 發送簡訊給我 |
|
iann
一般會員 ![]() ![]() 發表:17 回覆:31 積分:14 註冊:2003-08-30 發送簡訊給我 |
|
Chance36
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |