2014-02-20 58 views
5

我想在FireDAC中使用宏來預處理我的SQL查詢。我有一個數據模塊一個TADQuery對象與SQL設置是這樣的:FireDAC - 在宏展開後顯示SQL

Select * from MyTable 
    join OtherTable on MyTable.Key = OtherTable.Key 
&Where 

然後在我的代碼我這樣做:

WhereClause = 'stuff based on my form'; 
Query.MacroByName('Where').AsRaw := WhereClause; 
Query.Open; 

這對於複雜查詢的工作很好,因爲它讓我使用SQL Property編輯器確保我的字段和連接條件正確。

我的問題是當SQL語句由於where子句而最終無效時。 是否有任何方法可以在預處理後查看將要執行的SQL?現在我正在捕獲FireDac錯誤並顯示EADDBEngineException對象上的SQL。但是,這仍然顯示我的原始SQL與宏。如果在錯誤發生後我無法得到它,那麼無論如何要強制宏替換髮生,以便我可以查看調試器中的SQL以幫助我瞭解錯誤。

如果很重要我將連接到MS Access數據庫,目標是在不久的將來轉移到SQL Server。

+1

只是胡亂猜測(因爲我目前沒有手動安裝FireDAC),但是您不需要調用['Prepare'](http://docs.embarcadero.com/products/rad_studio/firedac/frames.html?frmname=topic&frmfile = uADCompClient_T ADRdbmsDataSet_Prepare.html)方法來觸發預處理?查詢準備的結果應該存儲在['SQLText'](http://docs.embarcadero.com/products/rad_studio/firedac/frames.html?frmname=topic&frmfile=uADCompClient_TADCustomCommand_SQLText.html)屬性中,但這裏是幫助相當混亂,我猜這個屬性隱藏在'TADSQLQuery'中。 – TLama

+0

嗯,我大致檢查了那裏發生了什麼,我仍然不確定是否調用'Prepare'(這對我來說毫無用處)是觸發預處理的最低要求。儘管預處理的SQL是發送到DBMS的,您可以通過['Text'](http://docs.embarcadero.com/products/rad_studio/firedac/frames.html?frmname=topic&frmfile=uADCompClient_TADCustomQuery_Text .html)屬性(這種屬性的相當罕見的名稱)。所以,我寧願等待一些可信的答案。好問題! – TLama

+1

@TLama - 謝謝! ADQuery.Text似乎是我需要的。我毫不猶豫地通過了該財產。從您的意見中,我確實在幫助文件中找到了另一個簡短的參考。 [跟蹤和監控](http://docs.embarcadero.com/products/rad_studio/firedac/Tracing_and_Monitoring.html)部分的底部標題爲「檢查SQL命令文本」。它看起來並不像我可以訪問錯誤對象上的.Text屬性,但它仍然是一個很大的幫助,能夠在調試器中看到它。 –

回答

1

(只是爲了刪除懸而未決的問題清單這一問題)

從評論:

嗯,我粗略地檢查發生些什麼事,我還沒有 知道打電話準備(這對我來說毫無用處)是觸發預處理的最低要求。雖然, 預處理的SQL,發送到DBMS的那個,您可以通過文本屬性(此類屬性的相當罕見的名稱)訪問 。 - TLama月 21 '14在8:18

+1

但肯定有評論說:「所以,我寧願等待一些可信的答案。」難道不是理想的候選人嗎? – MartynA

+0

在「ADQuery.Text似乎是我所需要的。」答案 - 是的。 FireDAC中沒有其他方法可以查看最終文本,並以命令的形式傳輸到DBMS服務器。 – Nashev

+0

在我們的應用程序中,我們擁有自己的FireDAC庫副本,並提供了一些修復,其中一些將通過Exception對象將此Text傳輸到異常處理程序,從而允許用戶通過最終文本和所有參數以及調用上下文的大部分信息來查看更多信息異常描述。 – Nashev

1

除了使用Text屬性,以監控SQL是什麼實際上將數據庫引擎,可以考慮使用 「FDMonitor」 FireDAC效用。按照DokWiki頁面(如下圖):

  • 您的窗體上放置一個TFDMoniRemoteClientLink組件,
  • 設置它的跟蹤屬性爲
  • 的MonitorBy = XXX連接定義參數添加到您現有的FDConnection零件。您可以在IDE對象檢查器中執行此操作,方法是選擇FDConnection組件,展開Params屬性並將MonitorBy設置爲mbRemote。

注意,TFDMoniXxxxClientLink應在數據模塊或形式創建順序TFDConnection之前到來,所以由形式或數據模塊,然後創建順序,並移動所述上TFDMoni右擊..成分FDConnection上述調整此。

此外,TFDMoniXxxxClientLink選項有助於禁用大部分記錄的事件,否則返回的所有數據也會顯示在FireDAC監視器中。展開EventKinds屬性,關閉所有事件類型,除了可能的ekConnConnect,ekConnPrepare和ekCmdExecute。

然後從IDE打開FireDAC監視器(工具> FireDAC監視器)。只有在顯示器運行後才啓動您的應用程序。雙擊跟蹤事件(在「跟蹤輸出」選項卡中),您將在底部窗格中看到發送到數據庫的實際SQL。

如上所述,添加ekConnPrepare的EventType似乎很可能會在查詢的Prepare被調用時顯示給您,但我沒有充分說明它的含義。

請參閱上DocWiki以下頁面瞭解更多信息:

概述:FDMonitor

如何:Tracing and Monitoring (FireDAC)

其他FireDAC公用事業:Utilities (FireDAC)