Sql-Server-2008
訪問 ODBC 保留錯誤 7711
我有使用者試圖通過 ODBC 連接使用 Access 2007 從我們的 Microsoft SQL Server 2008 R2 系統(最近移至全新的硬體/軟體堆棧)訪問一些表,這是他們多年來一直使用的方法. 現在他們得到’保留錯誤(-7711);沒有針對此錯誤的消息。
在我的Google搜尋過程中,我無法辨識任何與 Sybase 2003 版本無關的相關資訊。我猜我忘記在新盒子上設置一些配置設置的安全性,但對我來說,這個錯誤似乎很模糊,我不知道從哪裡開始。
您能提供的任何幫助將不勝感激。
原來問題出在使用“不受限制”權限創建的程序集上,在 Excel 下嘗試 ODBC 連接時,我收到了一個與 .NET 錯誤和此程序集相關的更詳細錯誤,將“權限集”更改為“安全”似乎解決這個問題。
我還發現,當 SQL Server(可能還有其他任何 ODBC 提供程序)返回過長的錯誤消息時,我會收到此錯誤。在我自己的測試中,我發現當 ODBC 錯誤消息的長度超過 511 個字元時會生成錯誤。
我沒有找到任何文件列出 511 個字元作為這些消息的最大長度,但它確實對應於一個圓形二進制數 (2 9 = 512),因此在這方面作為限制是有意義的。
庫存錯誤消息不太可能那麼長,但如果您返回自定義錯誤消息,則完全有可能。我採用的解決方法是在重新拋出之前擷取錯誤並對其進行修剪。
[Microsoft][ODBC SQL Server Driver][SQL Server]
在消息的開頭總是返回一些預設文本 ( )。根據表格的連結方式,該字元串可能略有不同,因此您可能需要調整修剪長度以適應。511 - Len("[Microsoft][ODBC SQL Server Driver][SQL Server]") = 464
所以我們需要將原來的錯誤資訊修剪為 464 個字元。我這樣做如下:
BEGIN TRY BEGIN TRANSACTION -- The T-SQL to execute goes here COMMIT TRANSACTION END TRY BEGIN Catch IF @@TRANCOUNT > 0 Rollback -- Raise an error with the details of the exception DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int SELECT @ErrMsg = LEFT(ERROR_MESSAGE(),464), -- adjust 464 based on above formula @ErrSeverity = ERROR_SEVERITY() RAISERROR(@ErrMsg, @ErrSeverity, 1) END CATCH