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

ADOQuery SQL執行後資料庫反映不即時

尚未結案
tzu_fan_chen
一般會員


發表:1
回覆:4
積分:1
註冊:2005-01-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-21 14:57:14 IP:61.222.xxx.xxx 未訂閱
我用ADOQuery1 跟 Aceess資料庫連結 當我下一個SQL ADOQuery1.close; ADOQuery1.sql.text := 'Insert Into table1 ........' ADOQuery1.ExecSQL; 程式執行到這一行結束後 我看Aceess資料,並沒有增加一行資料 這使得我之後的程式碼讀到的資料還是少一筆 我後來在ExecSQL之後再加一些 select * from table1 open close 看看是不是Buffer的問題 可是資料量還是少一筆 不過,將Form關掉之後,資料庫就多了那一筆資料了 不知道是什麼原因 要如何改善呢
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-21 15:21:39 IP:202.62.xxx.xxx 未訂閱
您好﹗    請問您是從哪里看出在Insert Into之后資料沒有新增進資料表中的呢﹖DBGrid元件還是利用取得資料筆數﹖一般來講﹐為了保持資料異動的正确性﹐在資料Insert Into進資料表后﹐我們都會使用資料感知元件的Close和Open的方法來取得最新的資料﹐如您的情況﹕
begin
  ADOQuery1.close;
  ADOQuery1.sql.text := 'Insert Into table1 ........'
  ADOQuery1.ExecSQL;
  ADOQuery1.Close;
  ADOQuery1.SQL.Text := 'Select * From Table';
  ADOQuery2.Open;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
tzu_fan_chen
一般會員


發表:1
回覆:4
積分:1
註冊:2005-01-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-21 15:33:22 IP:61.222.xxx.xxx 未訂閱
我是用Acess直接開啟資料庫來看的 而且有一直refrsh喔 另外我在該程式碼之後 還有用別的ADOQuery去讀資料 所讀到的資料也是少一筆 只有在關掉Form的時候會增加資料 我也覺得很奇怪 因為連MS SQL時就不會這樣 一執行就會有改變 這一次是連Access 就會比較遲鈍 我是用sql Connection裡的Jet 4.0 OLE DB Provider連接的
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-21 17:47:21 IP:202.62.xxx.xxx 未訂閱
您好﹗    一般來講是不會有這樣的現象的﹐您是否有開啟ADOConnection元件的交易功能﹐或者使用了ADOQuery元件的BatchUpdate功能﹐當Form在關閉之前用程式碼控制存入交易﹐或者UpdateBatch方法將用戶端的資料回存到資料庫中﹖    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
tzu_fan_chen
一般會員


發表:1
回覆:4
積分:1
註冊:2005-01-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-21 18:09:38 IP:61.222.xxx.xxx 未訂閱
我是用ADOQuery 配上 ADOConnection去連Access的 大大你說的交易功能是只哪個屬性呢 我是使用預設功能,ADOConnection只有改ConnectionString & logingpromt的屬性而已,其他都沒有動到 要怎麼取消ADOQuery元件的BatchUpdate功能 及UpdateBatch方法﹖
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-22 09:08:02 IP:202.62.xxx.xxx 未訂閱
您好﹗    ADO的交易功能的主要特征是在資料庫異動作業之前﹐在程式碼中有ADOConnection1.BeginTrans;部分﹐此程式碼作用即開始一筆新的交易﹐在完成資料庫異動作業之后﹐在程式碼中有ADOConnection1.CommitTrans;部分或ADOConnection1.RollbackTrans;部分﹐作用分別為确認交易和取消交易﹒    BatchUpdate功能是主要特征就是ADO資料集元件(在您的範例中﹐就是ADOQuery元件)的LockType屬性值為ltBatchOptimisic﹐然后在程式碼中包括ADOQuery1.UpdateBatch;和ADOQuery1.CancelBatch;部分﹐其作用分別為將暫存區的資料更新回后端資料庫和取消暫存區的資料異動﹐若需要取消的話﹐就刪除以上介紹的相關程式碼﹐并把LockType屬性值設為預設屬性ltOptimisic即可﹒    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
tzu_fan_chen
一般會員


發表:1
回覆:4
積分:1
註冊:2005-01-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-22 11:13:11 IP:61.222.xxx.xxx 未訂閱
大大你好 後來我把問題整理了一下 發現是這樣: 我有FORM1、FROM2 FORM1去show FORM2 在FORM2中對資料庫新增資料 並且叫FORM1的一個procedure FORM1的procedure是檢查資料庫中的筆數 結果count出來是之前的資料數 並不是Form2 Insert 的資料數 我把檔案放在上面,真的是找不到原因 麻煩大大幫我看一下 http://myhome.apbb.com.tw/tzu_fan_chen/1.exe 裡面的FORM1、FORM2 connectionstring屬性改一下就好了
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-22 12:01:14 IP:202.62.xxx.xxx 未訂閱
您好﹗    看了一下您的程式範例﹐發現問題的所在了﹐因為您是在Form1和Form2中分別使用了ADOQuery元件的ConnectionString屬性來連接上游的資料庫﹐所以當Form2中的ADOQuery元件在新增完資料后﹐Form1中的ADOQuery元件并不能及時地取得正确的資料庫信息﹐其取得的還是舊的資料庫信息﹐解決的方法如下﹕ 在Form1中加入一個ADOConnection元件(假設名稱為ADOConnection1)﹐然后用此ADOConnection元件來連接上游的資料庫﹐再將Form1和Form2中的ADOQuery元件的Connection屬性都設定為剛才加入的ADOConnection1即可﹐其它程式碼部分大多不做變動﹐只有Form1的Procedure ShowM程序中﹐修改小小的部分如下紅色處﹕
procedure TForm1.showM;
begin
  ADOQuery1.Close;
  ADOQuery1.sql.Text := 'Select count(*) as AAA from X1';
  ADOQuery1.Open;
  showmessage(IntToStr(ADOQuery1.fieldbyname('AAA').AsInteger));
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
tzu_fan_chen
一般會員


發表:1
回覆:4
積分:1
註冊:2005-01-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-22 12:17:57 IP:61.222.xxx.xxx 未訂閱
多謝大大 可以了 我現在將全部的Form的ADOQuery都指到同一個Connection 只是自己有一個疑問 問什麼分開就不行呢 我各自的Adowuery都已經close再open的丫 甚至也有試過Active false 再true 也是不行
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-03-22 12:35:35 IP:202.62.xxx.xxx 未訂閱
您好﹗    目前尚在做測試為何分別使用ADOQuery會出現這樣的現象﹒ 但為了提高程式的可攜性和處理效率﹐建議您在做多個ADO資料集元件的程式時﹐使用ADOConnection元件來做連線的動作﹐然后再將ADO資料集元件通過此ADOConnection元件來連接上游的資料庫﹐而不要直接使用ADO資料集元件來做連線的動作﹒    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
系統時間:2024-06-24 19:59:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!