2011-08-03 14 views
2

概述:
我寫一個應用程序,允許用戶定義查詢,提交到服務器並查看結果。該軟件可以在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

我不知道誰低估了你;因此+1,因爲我認爲這個問題是非常有效的。 –

+0

@Jeroen - 我在猜測,但我認爲downvote的原因是這個問題是,這樣或那樣,*誤導*。無論如何,調用'.SQL.Add'都可以運行查詢。它在.SQL中插入文本,在更改通知程序中關閉數據集,同時更新.SQL中的CommandText,在執行時初始化參數,清除FieldDefs上的更新標記等等。如果有的話,過程關閉,清除事情。還有一些其他未知的,不知道,錯誤處理的事件等。 –

+0

@塞爾特克 - 好吧,但爲什麼downvote?海事組織這是一個完美的格式和有效的問題。如果這是一個錯誤的方式,OP將如何做一些事情,讓我們指引他到正確的位置。 – 2011-08-03 20:58:06

回答

2

從您對問題的描述中,我假設您指定了ADOQuery的ConnectionString。這樣做將數據庫登錄與查詢的運行結合起來。您發現這在用戶憑據無效時會產生不良副作用。

使用ADOConnection將數據庫登錄與查詢分開。指定ADOConnection的ConnectionString並將ADOConnection分配給ADOQuery.Connection屬性。這樣,您可以控制數據庫登錄並可以捕獲具有錯誤憑據的登錄。此外,ADOConnection.Open方法允許您指定用戶名和密碼,因此您不必將它們放入ConnectionString中。

雖然這並沒有回答您的具體問題,但此方法將幫助您通過將登錄名與查詢運行分開來解決用戶配置文件被禁用的問題。

+0

你是對的。在我提交了我的問題(並在您回覆之前)之後,我回去重新檢查代碼並自己注意到了這一點。由於某種原因,該代碼不使用ADOConnection來建立連接。昨晚我沒有時間查看,但今天我會研究一下。 – Jeedee

+0

感謝您的正確方向。我本應該注意到這一點,但並沒有因爲某種原因!連接字符串在ADOQuery上指定,而不是在單獨的ADOConnection上指定。我現在在提交查詢之前處理連接,並且沒有關閉配置文件的問題。 – Jeedee