2014-12-04 94 views
0

背景:ODBC SQL Server的Unicode錯誤?

我們有一個使用ODBC API與Access和SQL Server進行交互的應用程序(動態,取決於用戶的配置)。

我發現了一個可能在ODBC SQL驅動程序中的錯誤,或者可能是我們創建的ODBC DSN的錯誤配置問題,或者可能是我們代碼中的某個錯誤。

當文檔被編輯並保存時,我們查詢數據庫以查看該文件是否在數據庫中有對應的記錄 - 如果是這樣,我們使用文檔中更新的數據更新記錄;如果沒有,我們做一個插入來爲它創建必要的記錄。

我們使用文件名作爲我們表上的唯一主鍵,並且這種方式正常工作。 的錯誤是,如果文件名包含當前ANSI代碼頁之外的字符,然後選擇表示不匹配:

SQL: SELECT * FROM "My Designs" WHERE "PATHNAME" = '\\FILE-SERVER\Home Folders\User Files\狹すぎて丸め処理が出來ません!!.foo' [# matches = 0] 

然而,當插入嘗試,我們得到了一個獨特的鍵衝突(當然) - 因爲那個文件名已經有記錄了。

Database error: Violation of PRIMARY KEY constraint 'PK__My Desig__1B3D5B4BF643706B'. Cannot insert duplicate key in object 'dbo.My Designs'. The duplicate key value is (\\FILE-SERVER\Home Folders\User Files\狹すぎて丸め処理が出來ません!!.foo). 
The statement has been terminated. 

我一直在用細齒梳代碼,我沒有看到任何錯誤。 :(

正在生成的SQL語句生成的文件名的Unicode輸出正確的。我們的應用程序被編譯爲Unicode格式。該列在ODBC SQL_WVARCHAR說話。

我已經嘗試添加AutoTranslate=no到DSN配置字符串,但似乎沒有任何效果

我試過從ODBC控制面板記錄數據庫連接,可悲的是,該接口產生一個ANSI日誌文件 - 所以我無法驗證使用該工具的UNICODE/ANSI問題。

次的問題:

  • 是否有一個工具,我可以用它來驗證這些聲明是 創建/ ODBC驅動程序到SQL Server數據庫 發出正確?
  • 有沒有更好的方式來使用ODBC,以便在SELECT查詢和INSERT請求中驅動程序不會被簡單的UNICODE字符串裝入?
  • 對如何處理這個問題的任何其他的想法(短更換我們的技術)
+0

您是否嘗試過使用SQL Server Management Studio進行命令?這是你應該做的第一件事,以確保你不會浪費時間認爲這是一個ODBC問題。 – PaulMcKenzie 2014-12-04 16:47:19

+0

@PaulMcKenzie - 使用SQL SMS無法正常工作。事實上,同一個查詢產生0個結果,但只包含當前代碼頁中的字符的結果會產生有效的結果。有任何想法嗎? – Mordachai 2014-12-04 18:48:06

+0

目標是查看SMS是否可以工作。如果SMS無法成功處理查詢,您將無法獲得使ODBC調用正常工作的程序。我不是SQL Server專家,但SMS通常是查看查詢是否有效的黃金標準。 – PaulMcKenzie 2014-12-04 19:38:45

回答

1

在SELECT語句中,請確保您附上where子句字符串A N告訴SQL它的Unicode:

..."PATHNAME" = N'\\FILE-SERVER\Home Folders\User Files\狹すぎて丸め処理が出來ません!!.foo' 

此外,MFC根據您的配置將數據轉換爲MCBS或UNICODE。確保你在記錄集中使用CStringT。

+0

謝謝 - 試圖讓這個工作現在。 N'string'語法在MS Access上失敗(我覺得我必須在ODBC中做這樣的錯誤,這種類型的錯誤不是由驅動程序處理的?)如果我能得到這個工作:) – Mordachai 2014-12-08 19:42:09