ADOQuery SQL執行後資料庫反映不即時 |
尚未結案
|
tzu_fan_chen
一般會員 發表:1 回覆:4 積分:1 註冊:2005-01-17 發送簡訊給我 |
我用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 發送簡訊給我 |
您好﹗ 請問您是從哪里看出在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 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
tzu_fan_chen
一般會員 發表:1 回覆:4 積分:1 註冊:2005-01-17 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 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 發送簡訊給我 |
大大你好
後來我把問題整理了一下
發現是這樣: 我有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 發送簡訊給我 |
您好﹗ 看了一下您的程式範例﹐發現問題的所在了﹐因為您是在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 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 目前尚在做測試為何分別使用ADOQuery會出現這樣的現象﹒
但為了提高程式的可攜性和處理效率﹐建議您在做多個ADO資料集元件的程式時﹐使用ADOConnection元件來做連線的動作﹐然后再將ADO資料集元件通過此ADOConnection元件來連接上游的資料庫﹐而不要直接使用ADO資料集元件來做連線的動作﹒ =================================
有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗
================================
------
忻晟 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |