請問"DBedit : field xxx not found"解決方法 |
尚未結案
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
各位先進好!
我欲用一個ADOQuery在一個資料庫的兩個tables中取兩筆資料,步驟是:
1。先用ADOquery查找table1是否存在指定的Record1
2。如果存在,再根據Record1,用ADOquery在table2找到Record2,並在DBedit中顯示指定field,
(
ADoquery 的 SQL 為: Select * from table2 //使DBedit在table2選擇 datafield
Datasource1 的 dataset 為: ADoquery
DBedit 的 Datasource為: Datasource1
)
Q:我想用一個ADOquery先查table1,再查table2,程式一運行,ADoquery的SQL變為Select * from table1,因為table1不包括'BookIsbn'這個field,結果就顯示DBedit的dataField不存在,如:"DBedit1: field 'BookIsbn' not found"。
請問如何解決這個問題?
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
誠如 Justmade 前輩所言, 用兩個 adoquery 元件是比較簡單的解決方法.
另外補充一下, 可以這樣解決: 1. 使用 ADOQuery 處理 table1 之前, 先斷與 Datasource1 的關係. (將 Datasource1.DataSet 設為 nil )
2. 若在 table1 中找到 record1 後, 先 close ADOQuery 完成後再將 Datasource1.DataSet 設定回 ADOQuery 後, 即可進行後續往 table2 查找的動作, 如此一來就不需要用到兩個 datasource了.
這也是在資料感知元件和 dataset 之間要多一層 datasource 的好處..
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
感謝兩位先進回應!
Timhuang的辦法試了一下,但仍不成功。
不知這兩個SQL command 有何區別?
1. adoquery2‧sql‧add('select * from STDinfo ');
adoquery2‧sql‧add(' where STDNO = :STDNO ');
adoquery2‧Parameters‧ParamByName('STDNO')‧value:=edit2‧text;
2. adoquery2‧sql‧add('select * from STDinfo where STDNO=''' edit2‧text ''' ');
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
實際執行結果沒分別但執行效率在不同情況會有所分別 若該 SQL 設定後只執行一次,第二種方法效率稍好一點。 但若該 SQL 之後會因應不同的 parameters 作執行,則第一種方法較好,因之後只是代入不同的 Param 不用每次重新分析SQL語句。 不成功是甚麼意思丫 我之前是假設你 Table1 都要連一些感知元件所以便說要兩個 DataSources, 若你 Table1 不用連感知元件,確是如 timhuang 兄所言的不需那個DataSources. 但原則始終是 : 在 SQL 改成 Table2 前別設 DBEdit 的 DataSources 的 DataSet 為 ADOQuery 就應不會有錯誤的。若還有問題,你可以貼你相關的 CODE 上來看看嗎?
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
感謝前輩Justmade的指點! 源碼如下: //先察看學生借書紀錄,是否有欠書未還
procedure TForm1‧FormCreate(Sender: TObject);
begin
//edit2‧text 取得學生編號後做以下處理
datasource1‧dataset:=nil;// Datasource1 的
adoquery1‧close;
adoquery1‧sql‧clear;
try
adoquery1‧sql‧add('select * from STDinfo ');
adoquery1‧sql‧add(' where STDNO = :STDNO ');
adoquery1‧Parameters‧ParamByName('STDNO')‧value:=edit2‧ text;
adoquery1‧open; if not adoquery1‧isempty then
begin
EDIT3‧text:=adoquery2‧Fields[3]‧asstring;
end
else
showmessage('!!!');
except
raise exception‧create('!!!!!');
end;
datasource1‧dataset:=adoquery1;//設定回 ADOQuery
end; //如未有欠書,察看欲借圖書是否存在。 dbedit2顯示圖書現在狀態(已借出 、已歸還)
procedure TForm1‧Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['0'‧‧'9',#8,#13]) then
begin
key:=#0;
showmessage('!!!');
end
else if (key=#13) and (length(edit1‧Text)=14) then
begin
adoquery1‧close;
adoquery1‧sql‧clear;
try
adoquery1‧sql‧add('select * from Bookinfo where BOOKISBN=''' edit1‧text ''' ');
adoquery1‧open;
if not adoquery1‧isempty then
begin
messagebeep(0);
end
else
showmessage('!!!');
except
showmessage('!!!!!');
end;
edit1‧text:='';
dbedit2‧text:='';
end;
end;
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
...略...
2. 若在 table1 中找到 record1 後, 先 close ADOQuery 完成後再將 Datasource1.DataSet 設定回 ADOQuery 後, 即可進行後續往 table2 查找的動作, 如此一來就不需要用到兩個 datasource了.
...略... 由於你在開啟 adoquery1 後並未關閉的狀況下就直接將 datasource1 設定 dataset 於 adoquery1 上, 造成和原來一樣的問題, 請加入下面的紅色部分程式即可!!
//先察看學生借書紀錄,是否有欠書未還 procedure TForm1‧FormCreate(Sender: TObject); begin //edit2‧text 取得學生編號後做以下處理 datasource1‧dataset:=nil;// Datasource1 的 adoquery1‧close; adoquery1‧sql‧clear; try adoquery1‧sql‧add('select * from STDinfo '); adoquery1‧sql‧add(' where STDNO = :STDNO '); adoquery1‧Parameters‧ParamByName('STDNO')‧value:=edit2‧ text; adoquery1‧open; if not adoquery1‧isempty then begin EDIT3‧text:=adoquery2‧Fields[3]‧asstring; end else showmessage('!!!'); except raise exception‧create('!!!!!'); end; adoquery1.close; datasource1‧dataset:=adoquery1;//設定回 ADOQuery end; |
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
怪小弟愚駑,前輩Justmade指點的很對,小弟因怕Post code 太繁,延誤各位先進太多時間,將需要用到的Edit2.text從另一event 處理中搬來,看起來精簡一點,沒想到得此失彼,Edit2.text確實不應放到Form1.create中,我想表達的原意是在察看生借以前,edit2.text中已取得學生學號,再做以下資料庫查找操作。至於忽然冒出的 "ADOQuery2.Field[3].AsString" ,是愚弟自擺烏龍球,純屬筆誤,應為"ADOQuery1.Field[3].AsString"‧
按TimHuang兄的指點,在正常情況下,問題是得到解決了,但碰到例外,即BOOKISBN或STDNO在資料庫中根本不存在時,會出現錯誤訊息" project xxx‧exe raied exception class EoleException with message 'BOF' or 'EOF' 中有一個是 true" ,我已經加了try‧‧‧except‧‧‧end,不知怎麼還會出現這個錯誤訊息。本來我並不想提這種問題,麻煩大家,但我用了4個小時,還沒有頭緒,希望各位先進能給予指點。
另想請教各位先進,我的程式只用了1個Form、1個DBedit、1個ADOquery、1個Datasoure、3個Edit,程式一運行竟用了8200KB的physical Memory,程式主要部分 Source code 如上,對我們學校的Computers 來說一個這麼小的程式佔用8200KB的physical Memory有點多了,我不知道問題出在何處,希望各位先進指點。
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
引言: 但碰到例外,即BOOKISBN或STDNO在資料庫中根本不存在時,會出現錯誤訊息" project xxx‧exe raied exception class EoleException with message 'BOF' or 'EOF' 中有一個是 true" ,我已經加了try‧‧‧except‧‧‧end,不知怎麼還會出現這個錯誤訊息。本來我並不想提這種問題,麻煩大家,但我用了4個小時,還沒有頭緒,希望各位先進能給予指點。這是delphi 在包裝 ado 的 bug , 請上 borland 網站找相關的 patch 更新一下即可... 剛找了一下, 在這裡.. http://info.borland.com/devsupport/delphi/mdac26.html 發表人 - timhuang 於 2003/05/05 17:23:28 |
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
感謝TimHuang兄和Hagar兄的悉心指點! 但我不知道為什麼用以下方式改寫就不會出現那個錯誤訊息,即增加一個adotable1.Locate: try
adoquery1.close;
adoquery1.sql.clear;
if adotable1.Locate('BOOKISBN',edit1.text,[]) then
begin
adoquery1.sql.Add('select * from Bookinfo where BOOKISBN=''' edit1.text ''' ');
adoquery1.open;
end
else
showmessage('!!!');
except
showmessage('!!!!!');
end;
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |