2008-11-26 62 views
2

我有一個.NET 3.5 C#庫,它使用OleDb從Excel文件中提取數據並將其返回到SQL Server 2005中CLR表值函數使用的DataRowCollection中。SQL CLR函數和OleDb權限

我將SQL Server中的ASSEMBLY部署爲sa,並使用PERMISSION_SET = EXTERNAL_ACCESS。 sa登錄有EXTERNAL ACCESS ASSEMBLY,數據庫有TRUSTWORTHY

的組件簽署和我用下面的Caspol.exe命令,這表明它是成功的:

-m -ag All_Code -url "C:\Testing\sqlFunction.dll" FullTrust -n "sqlFunction" 

SQL Server實例,我的圖書館和Excel文檔都在同一臺機器上。

的SQL Server服務作爲本地系統運行(但在試圖得到這個工作,我也試着運行它作爲我的身份登錄的AD用戶也是一個本地管理員)。

我創建了一個命令行應用程序來測試運行庫,一切都正常運行並且按預期的方式返回的數據。

但是當我運行從SSMS的功能,我得到這個錯誤的結果窗格:

的用戶定義的例程或聚合「GetExcelFile」執行過程中出現

一個.NET Framework錯誤:
系統.Security.SecurityException:請求類型 'System.Data.OleDb.OleDbPermission,System.Data,版本= 2.0.0.0,文化=中性公鑰= b77a5c561934e089' 的許可失敗。
System.Security.SecurityException:
在System.Security.CodeAccessSecurityEngine.Check(對象的需求,StackCrawlMark & stackMark,布爾isPermSet)
在System.Security.PermissionSet.Demand()
在System.Data.Common。 DbConnectionOptions.DemandPermission()
在System.Data.OleDb.OleDbConnection.PermissionDemand()
在System.Data.OleDb.OleDbConnectionFactory.PermissionDemand(的DbConnection outerConnection)
在System.Data.ProviderBase.DbConnectionClosed.OpenConnection(的DbConnection outerConnection ,DbConnectionFactory connectionFactory)
在System.Data.OleDb.OleDbConnection.Open()
在System.Data.Common.DbDataAdapter.QuietOpen(的IDbConnection連接,ConnectionState & originalState)
在System.Data.Common.DbDataAdapter.FillInternal(數據集的數據集, DataTable [] DataTables,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand命令,CommandBehavior行爲)
at System.Data.Common.DbDataAdapter.Fill(DataTable [] dataTables,Int32 startRecord,Int32 maxRecords,IDbCommand command,CommandBehavior behavior) (DataTable dataTable)
at GetExcelFunction.GetFile()
在GetExcelFunction.InitMethod(字符串日誌名)

我我個人開發機(XP PRO)和我們的開發沙箱(服務器2003)上部署了這一點,並得到了同樣的錯誤。

大多數代碼訪問安全問題都圍繞着從網絡共享運行的程序集 - 但這不是這種情況。

任何想法?我被挖掘出來了。

回答

1

解決了!

PERMISSION_SET = EXTERNAL_ACCESS不夠。我不得不一直下到PERMISSION_SET = UNSAFE,然後開始工作。我不相信我以前沒有嘗試過。

0

對不起,我沒有提供解決方案,在這裏的確切問題。

但是,您可以使用OPENROWSET函數來處理來自SQL Server的Excel文件。 CLR是沒有必要的,除非有什麼我不知道的。

+0

我使用CLR的主要原因是我有許多其他要求,涉及使用Excel文件而不是簡單地將數據拉出。第二個原因是我的生產環境是64位,還沒有一個64位的JET驅動程序,所以我無論如何都不能使用OPENROWSET。 – 2008-11-27 04:33:42

0

我正在查看使用反射器的代碼。我純粹是在猜測代碼。

嘗試初始化System.Data.OleDb.OleDbPermission類&使用它的Add方法來包含excel連接字符串以具有權限(在連接打開或查詢執行之前)。

我希望有幫助。

+0

謝謝shahkalpesh。我創建了一個OleDbPermission並使用它的add方法和我的連接字符串。 – 2008-11-27 19:32:23