概述:
我寫一個應用程序,允許用戶定義查詢,提交到服務器並查看結果。該軟件可以在DB2或MySQL上運行。TADOQuery SQL.add()提交/編寫SQL
問題:
我們已經有其中一個用戶試圖運行查詢的DB2版本的問題,並發現它已經失敗了,因爲他們的用戶配置文件已被禁用。爲了在DB2上運行查詢(在IBM i上),用戶的配置文件名稱和密碼在連接字符串中提供。服務器上的安全性可以指定用戶的配置文件在兩次或三次不正確登錄後被禁用。
問:
我調試的應用程序,發現問題到被提交兩次查詢。如果用戶的密碼錯誤,那麼當然,這具有禁用其配置文件的連鎖效應。
在進一步檢查時,當我檢查服務器上的日誌時(逐行調試時),我發現在調用TADOQuery.sql.add()時查詢會提交給服務器,並且再次將TADOQuery的活動索引設置爲true(這是我期望將查詢提交給服務器的時間點)。下面是我使用運行查詢的代碼示例:
adoqry.active := false;
adoqry.sql.clear;
adoqry.sql.add('SELECT * FROM SOMEDB.SOMETABLE');
adoqry.active := true;
我的問題,因此是相當簡單:
1.爲什麼TADOQuery.sql.add()方法提交查詢(當它應該只是將SQL添加到TADOQuery的SQL屬性)?
2.我能做些什麼來防止這種情況發生?即有什麼辦法可以防止我在調用add()方法時提交的sql?
對於那些希望獲得有關日誌的額外信息的人,IBM i上的退出點日誌顯示,當我在上面的示例中調用adoqry.sql.add時,將通過「Database Server- SQL請求「退出點應用程序,通過功能」準備和描述「。當我在上面的例子中調用adoqry.active:= true時,相同的查詢會通過相同的退出點應用程序,但是通過「打開/描述」功能。
如果您對IBM i不熟悉,請不要擔心 - 我只是將這些信息包含在內,以證明我已經追蹤了兩次提交的查詢。真正的問題在於TADOQuery的sql.add()處理。
我不知道誰低估了你;因此+1,因爲我認爲這個問題是非常有效的。 –
@Jeroen - 我在猜測,但我認爲downvote的原因是這個問題是,這樣或那樣,*誤導*。無論如何,調用'.SQL.Add'都可以運行查詢。它在.SQL中插入文本,在更改通知程序中關閉數據集,同時更新.SQL中的CommandText,在執行時初始化參數,清除FieldDefs上的更新標記等等。如果有的話,過程關閉,清除事情。還有一些其他未知的,不知道,錯誤處理的事件等。 –
@塞爾特克 - 好吧,但爲什麼downvote?海事組織這是一個完美的格式和有效的問題。如果這是一個錯誤的方式,OP將如何做一些事情,讓我們指引他到正確的位置。 – 2011-08-03 20:58:06