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

QUERY中CLOSE和OPEN的用法

尚未結案
charse
一般會員


發表:5
回覆:9
積分:7
註冊:2004-06-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-09 00:02:06 IP:140.115.xxx.xxx 未訂閱
對不起~小弟之前在 同一個帖子 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=51445 問了兩個問題 現在開一個新的問題帖 感謝stillalive: ERRORMESSAGE終於改變了 ==========出現找不到性別欄位的錯誤============= with Adoquery1 do begin SQL.Clear; tmp1:=DBEdit1.Text; tmp2:=DBEdit2.Text; tmp3:=DBCombobox1.Text; tmp4:=DBEdit3.Text; tmp5:=DBEdit4.Text; sql.Text:= 'select max(客戶編號) as num_column from 客戶'; OPEN ; num_column:= FieldbyName('num_column').AsInteger 1; SQL.Clear; SQL.Add('Insert into 客戶(客戶編號,客戶名稱,聯絡人,性別,地址,電 話) Values(:客戶編號,:客戶名稱,:聯絡人,:性別,:地址,:電話) '); parameters.ParamByName('客戶編號').value:=num_column; parameters.ParamByName('客戶名稱').value:=tmp1; parameters.ParamByName('聯絡人').value:=tmp2; parameters.ParamByName('性別').value:=tmp3; //我曾經把有關性別的欄位全拿掉但是竟出現一樣的錯誤 parameters.ParamByName('地址').value:=tmp4; parameters.ParamByName('電話').value:=tmp5; execSQL; refresh_data;//自己寫的更新TABLE的方法 end; ================================= 可以順便請教一下 OPEN,CLOSE跟execSQL真正的功能嗎? 越搞越糊塗 感覺老天爺在懲罰我.... 我做了什麼錯事嗎....要是寫出來明天就吃素....... 發表人 - charse 於 2004/06/09 00:05:09
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-09 09:25:28 IP:202.39.xxx.xxx 未訂閱
Close/Open 是用在 SQL 語句為 Select 之類 ExecSQL 是用在 SQL 語句為 Insert/Update/Delete 之類 如果 SQL 語句是 Select 類, 那在改變 SQL 前要 Close
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-09 09:41:03 IP:211.162.xxx.xxx 未訂閱
Hi,charse,您好! 我試著解釋一下您的第2個問題: 要在運行時執行查詢,可以使用Open或者ExecSQL方法: ----Open方法:執行返回結果集的查詢,如帶有Select語句 ----ExecSQL方法:執行不需要返回結果集的查詢,如帶有Insert,Update或Delete語句    注意:如果在設計時不知道一個查詢是否在運行時要返回結果集,應該在try...catch程式塊中包含兩種查詢執行方式。    看看下面的code(這是C++代碼,和Delphi原理是相通的):
         try
        {
            Query1->Open();
        }
        catch(Exception &E)
        {
            if(!dynamic_cast(&E))
                throw;
        }
try子句中調用Open方法,這就允許禁止錯誤消息的發生,因爲一個可用的方法沒有應用到合適的SQL語句上。檢查所産生異常的類型,如果不是ENoResult異常,那麽一定是其他原因引起的異常,必須進行處理。這就是因爲當查詢使用Open方法啟動時將要執行查詢,但除了那個之外會産生一個異常. 1 執行返回結果集的查詢 ①調用Close方法以確保查詢還沒有被打開。如果查詢已經打開,就不能在關閉它之前再次打開它。關閉查詢後並重新打開它,將從Server提取新的資料. ②調用Open方法進行查詢 例如: Query1->Close(); ..... Query1->Open(); //返回一個設置結果 如果需要瀏覽結果集的資訊,那沒就要考慮使用'關閉雙向cursors' 2 執行沒有結果集的查詢 要執行不返回結果集的查詢的SQL語句,調用ExecSQL進行查詢: Query1->ExecSQL(); hagar 版大,不好意思,我當時打開該帖時,沒有看見您的回帖,Sorry,不好意思,請原諒我的無知

===============
人生在勤,不索何獲? 
===============
發表人 - bigdogchina 於 2004/06/09 09:47:45
------
人生在勤,不索何获?
charse
一般會員


發表:5
回覆:9
積分:7
註冊:2004-06-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-09 10:44:56 IP:140.115.xxx.xxx 未訂閱
多謝版大和bigdogchina的耐心的清晰說明 可是我的性別欄位出錯就跟這幾個指令沒關係了吧 ....好奇怪ㄝ 我如果不用指定MX的方式而是用RECORDCOUNT來取得新加入資料的編號 可以執行出正確結果(不會說找不到性別欄位) 只不過當我刪除資料時 如果沒有從最後開始刪可以想見有什麼情況發生 就是出現編號欄位值重複的問題....
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-09 10:56:04 IP:218.80.xxx.xxx 未訂閱
先CLOSE然后可以赋参数(ParamByName) parameters.ParamByName('客戶編號').value:=num_column; parameters.ParamByName('客戶名稱').value:=tmp1; parameters.ParamByName('聯絡人').value:=tmp2; parameters.ParamByName('性別').value:=tmp3; 再OPEN就得到结果集
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-09 11:09:06 IP:202.39.xxx.xxx 未訂閱
引言: Hi,charse,您好! 我試著解釋一下您的第2個問題: 要在運行時執行查詢,可以使用Open或者ExecSQL方法: ----Open方法:執行返回結果集的查詢,如帶有Select語句 ----ExecSQL方法:執行不需要返回結果集的查詢,如帶有Insert,Update或Delete語句 注意:如果在設計時不知道一個查詢是否在運行時要返回結果集,應該在try...catch程式塊中包含兩種查詢執行方式。 看看下面的code(這是C 代碼,和Delphi原理是相通的):
         try
        {
            Query1->Open();
        }
        catch(Exception &E)
        {
            if(!dynamic_cast(&E))
                throw;
        }
try子句中調用Open方法,這就允許禁止錯誤消息的發生,因爲一個可用的方法沒有應用到合適的SQL語句上。檢查所産生異常的類型,如果不是ENoResult異常,那麽一定是其他原因引起的異常,必須進行處理。這就是因爲當查詢使用Open方法啟動時將要執行查詢,但除了那個之外會産生一個異常. 1 執行返回結果集的查詢 ①調用Close方法以確保查詢還沒有被打開。如果查詢已經打開,就不能在關閉它之前再次打開它。關閉查詢後並重新打開它,將從Server提取新的資料. ②調用Open方法進行查詢 例如: Query1->Close(); ..... Query1->Open(); //返回一個設置結果 如果需要瀏覽結果集的資訊,那沒就要考慮使用'關閉雙向cursors' 2 執行沒有結果集的查詢 要執行不返回結果集的查詢的SQL語句,調用ExecSQL進行查詢: Query1->ExecSQL(); hagar 版大,不好意思,我當時打開該帖時,沒有看見您的回帖,Sorry,不好意思,請原諒我的無知

===============
人生在勤,不索何獲? 
===============
發表人 - bigdogchina 於 2004/06/09 09:47:45
哇咧! 沒規定小弟回覆以後, 大家都不能再回了吧! 這裡可是沒有白色恐怖的哦!
系統時間:2024-06-26 23:49:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!