全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2676
推到 Plurk!
推到 Facebook!

請問"DBedit : field xxx not found"解決方法

尚未結案
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-04 14:49:18 IP:61.185.xxx.xxx 未訂閱
各位先進好! 我欲用一個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-04 15:40:21 IP:218.16.xxx.xxx 未訂閱
最簡單的方法就是使用兩個 adoquery 一個處理 Table1 一個處厘 Table2 次簡單的方法就是使用兩個 DataSources, 當處理Table1時接 DataSources1 (DataSources2.DataSet := NIL) 當處理 Table2時接 DataSources2(接 DBEdit) 不怕麻煩的可先設 DBEdit.Field := '' 等 ADOQuery 選 Table2 才設真正的值 不過,為甚麼不用簡單的呢?
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-04 15:53:48 IP:61.221.xxx.xxx 未訂閱
誠如 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-04 17:39:25 IP:61.150.xxx.xxx 未訂閱
感謝兩位先進回應! 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-04 18:12:37 IP:218.16.xxx.xxx 未訂閱
實際執行結果沒分別但執行效率在不同情況會有所分別 若該 SQL 設定後只執行一次,第二種方法效率稍好一點。 但若該 SQL 之後會因應不同的 parameters 作執行,則第一種方法較好,因之後只是代入不同的 Param 不用每次重新分析SQL語句。 不成功是甚麼意思丫 我之前是假設你 Table1 都要連一些感知元件所以便說要兩個 DataSources, 若你 Table1 不用連感知元件,確是如 timhuang 兄所言的不需那個DataSources. 但原則始終是 : 在 SQL 改成 Table2 前別設 DBEdit 的 DataSources 的 DataSet 為 ADOQuery 就應不會有錯誤的。若還有問題,你可以貼你相關的 CODE 上來看看嗎?
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-04 19:08:20 IP:61.150.xxx.xxx 未訂閱
感謝前輩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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-04 20:10:49 IP:218.16.xxx.xxx 未訂閱
你的程式碼怪怪的,甚麼放在 FormCreate 裡的? 那時侯Edit2.Text 有資料嗎? 甚麼又忽然會有 ADOQuery2.Field[3].AsString 的 你最好說說出錯行數和錯誤訊息...
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-04 20:11:18 IP:61.221.xxx.xxx 未訂閱
...略... 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-05 17:09:19 IP:61.150.xxx.xxx 未訂閱
怪小弟愚駑,前輩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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-05 17:19:35 IP:211.76.xxx.xxx 未訂閱
引言: 但碰到例外,即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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-05 17:20:54 IP:202.39.xxx.xxx 未訂閱
"Either Eof or Bof is True" 的錯誤訊息 是 Delphi 5 對 ADO2.6 的 Bug 到這裏下載 patch 來更新: http://www.borland.com/devsupport/delphi/downloads/dent501readme.html http://www.borland.com/devsupport/delphi/mdac26.html    --- 每個人都是一本書
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-05-05 18:05:11 IP:61.185.xxx.xxx 未訂閱
感謝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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-05-05 18:18:11 IP:211.76.xxx.xxx 未訂閱
因為使用 locate 是在已 select 出來的資料集之中來查找資料, 並不是對資料庫下 command 查資料... 所以是在 local 端找已 select 出來的資料, 並不會進資料庫查資料, 所以當然也就不會發生問題.
系統時間:2024-06-29 11:54:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!