2009-02-17 30 views
2

我正在使用C++來使用ODBC查詢SQL Server 2005數據庫。查詢包含使用SQLSetParam()設置的參數。我通過調用SQLExecute()來運行查詢。如何獲取ODBC驅動程序嘗試執行的原始查詢?

偶爾查詢會失敗,我需要記錄失敗的上下文。我正在調用SQLError()來獲取錯誤信息,但我也想記錄ODBC驅動程序試圖運行的原始查詢 - 也就是查詢的參數值已展開。任何人都可以建議是否有方法可以訪問此?

上下文是生產環境中的錯誤日誌記錄。當錯誤發生時,我不是「那裏」,所以我不能使用分析器或類似的工具。這就是爲什麼我想記錄儘可能多的信息以供以後分析。

回答

0

沒有。據我的理解,這不是ODBC的工作原理:參數根本不會被「擴展」,而是分別發送到服務器。

對於您的日誌記錄情況,只需將參數轉換爲字符串ad-hoc並將它們插入到語句文本中,然後再將其寫入日誌文件。這就是我們在我們的框架中做到的,並且它工作正常。對於某些參數類型,您必須決定是否支持人類可讀的日誌記錄或複製粘貼到SQL Server中進行復制。

0

看看SQL事件探查器,看看實際發送到服務器的是什麼?

我們的APP調用SProcs(有點不同),我們記錄了所有的Sproc調用,以及發送了什麼參數;然後我們用來自Sproc的返回值更新日誌(所以我們可以報告在沒有返回結果的情況下發生某種災難性故障的日誌條目)

然後我們可以重新運行任何具有參數的失敗SProcs他們被給予看看我們得到什麼結果。

當我們重新運行它們,我們與

BEGIN TRANSACTION 

EXEC MySproc @FOO='BAR', ... 

ROLLBACK 

包裝他們,讓他們不要做任何更改DB

+0

嗯,好的,你說你不想運行Profiler,很抱歉 – Kristen 2009-02-17 12:14:30

1

您可以啓用ODBC通過控制面板上的客戶端跟蹤,但要做好重大性能測試和一些非常大的日誌文件的閱讀準備。