Sql-Server-2008

訪問 ODBC 保留錯誤 7711

  • December 3, 2013

我有使用者試圖通過 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

引用自:https://dba.stackexchange.com/questions/10816