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

ADOQuery + Locate + FilterRecord 發生Record not found 例外

答題得分者是:herbert2
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-31 17:51:54 IP:61.57.xxx.xxx 訂閱
各位前輩~
我想要透過Locate Method來過濾完全符合我 Edit1所輸入的文字,當沒有找到資料時卻發生了 "Record not found" 的例外~之後當我透過ADOQuery->Next() 時,資料卻都是null @.@~ 我該如何讓程式可以正常的顯示 else裡面的內容???當發生例外時,也不該造成Next Prior 等method不正常,有哪位前輩可以告訴我該如何解決這樣的問題呢?謝謝

下面是我大概的code

FormCreate
ADOQuery1->SQL->Text = "SELECT * FROM songtable";
ADOQuery1->Active = true;

Button1 onClick

TLocateOptions Opts;
Opts.Clear();
Opts << loPartialKey;
ADOQuery1->Filtered = true;
if(ADOQuery1->Locate("ID",Edit1->Text,Opts)) // <-----當找不到資料時,會發生例外,且會造成 Next Prior 等 Method無法正常work?why?
{
ShowMessage("找到 ID");
}
else
{
ShowMessage("ID不存在");
}
}
ADOQuery1->Filtered = false;

ADOQueryFilterRecord Method 中

String Tmp = DataSet->FieldByName("ID")->AsString;
if(Tmp.AnsiCompare(Edit1->Text.Trim()) == 0)
{
Accept = true;
}
else
{
Accept = false;
}
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-31 20:46:02 IP:211.72.xxx.xxx 訂閱
執行 DataSet Locate(), 要注意 Key Field List 為一欄與多欄要用不同之參數.
一欄時: Locate(String KeyName, Variant KeyValue, TLocateOptions Options)
多欄時: Locate(String KeyNameList, VarArrayOf(Variant KeyValueArray, int ArrayCount-1),
TLocateOptions Options)
使用 Method 時, 請查 Help 瞭解相關參數之 Type 才不會發生 Error.
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-31 21:45:25 IP:61.57.xxx.xxx 訂閱

您好~
我用foxpro 5 將 ID 設定為char型態~我想用Edit1->Text 當參數應該不會有問題才對~因為如果找的到資料的話 就沒問題~但是找不到資料時~就會發生例外~不曉得哪邊我該再多多注意呢??ADOQuery有哪些屬性與Locate有關嗎??謝謝~~

===================引 用 herbert2 文 章===================
執行 DataSet Locate(), 要注意 Key Field List 為一欄與多欄要用不同之參數.
一欄時: Locate(String KeyName, Variant KeyValue, TLocateOptions Options)
多欄時: Locate(String KeyNameList, VarArrayOf(Variant KeyValueArray, int ArrayCount-1),
TLocateOptions Options)
使用 Method 時, 請查 Help 瞭解相關參數之 Type 才不會發生 Error.
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-01-01 09:37:20 IP:211.72.xxx.xxx 訂閱
Locate() 要的 Type 是 Variant 不是 Edit1->Text 的 AnsiString,
有找到便沒發生問題, 不表示沒找到也應該沒問題.

C/C 語言對 Type 要求甚嚴, 但也有自動轉換 Type 的機制.
除非有絕對把握, 寧可用對 Type, 別依賴自動轉換.

使用 Method 時, 請查 Help 瞭解相關參數之 Type.
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-01-02 11:37:44 IP:61.57.xxx.xxx 訂閱
感謝您的回覆~
我本來一開始也是有用Variant (Edit1->Text ) 但是發現有沒有並沒有太大的影響~也許我的欄位本來就是字元的關係巴~
但是後來我發現好像是我測試的資料的問題~ 因為只要我輸入ID 為 ff 只要兩個ff以上的當作ID就會發生問題但是 ff3 就不會有問題~~~
真是詭異的問題~然到ff是有特殊意義嗎????謝謝!!!

目前我使用的環境為
Complier
BCB 6.0 SP4

Compents
ADOConnect ADOQuery

DB
Foxpro 5.0

===================引 用 herbert2 文 章===================
Locate() 要的 Type 是 Variant 不是 Edit1->Text 的 AnsiString,
有找到便沒發生問題, 不表示沒找到也應該沒問題.

C/C 語言對 Type 要求甚嚴, 但也有自動轉換 Type 的機制.
除非有絕對把握, 寧可用對 Type, 別依賴自動轉換.

使用 Method 時, 請查 Help 瞭解相關參數之 Type.
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-01-02 19:50:59 IP:211.72.xxx.xxx 訂閱
抱歉, 用 BCB5 SP2 之 TQuery 未發生此種情形, 故不知是否您的 Update 版本的問題.
倒是執行 BDE 之 TQuery->Locate(FieldNames, Variant(FindStr), Options); 時,
若 FindStr 是中文字時, 有時候(非每次)會發生 Operation not applicable, 故用
try {
TQuery->Locate(FieldNames, Variant(FindStr), Options);
}
catch (...) {
TQuery->First();
}
不予處理來解決.
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-01-03 02:55:05 IP:61.57.xxx.xxx 訂閱
感謝您的回覆~~
今天我試了一下~用Foxpro簡單的建立新的表格~但是卻沒有我這樣的情況~
輸入ff 當id的值並不會發生例外~~~~目前還查不到原因~~也許我在重建我的表格或許就沒有這樣的問題~~
謝謝您的協助~~~

===================引 用 herbert2 文 章===================
抱歉, 用 BCB5 SP2 之 TQuery 未發生此種情形, 故不知是否您的 Update 版本的問題.
倒是執行 BDE 之 TQuery->Locate(FieldNames, Variant(FindStr), Options); 時,
若 FindStr 是中文字時, 有時候(非每次)會發生 Operation not applicable, 故用
try {
TQuery->Locate(FieldNames, Variant(FindStr), Options);
}
catch (...) {
TQuery->First();
}
不予處理來解決.
系統時間:2024-03-29 3:20:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!