0

早上好。我目前遇到 CLR 存储过程调用在 Visual Basic (VS 2008) 中创建的程序集的问题。在最高级别,程序集执行 Cognos8 中包含的报告并将输出移动到网络上的特定目录。从简单的测试 EXE 调用该方法时我没有问题,但是当我尝试通过 CLR 存储过程执行时,我得到以下信息:

消息 6522,级别 16,状态 1,过程 ReportRunner,第 0 行

在执行用户定义的例程或聚合“ReportRunner”期间发生 .NET Framework 错误:

System.IO.FileNotFoundException:无法加载文件或程序集“cognosdotnetassembly_2_0,版本=10.1.4707.501,Culture=neutral,PublicKeyToken=d6e6d7d808b7e5b7”或其依赖项之一。该系统找不到指定的文件。System.IO.FileNotFoundException:

在 System.Reflection.Assembly._nLoad(AssemblyName 文件名,字符串 codeBase,证据 assemblySecurity,程序集 locationHint,StackCrawlMark 和 stackMark,布尔 throwOnFileNotFound,布尔 forIntrospection)

在 System.Reflection.Assembly.nLoad(AssemblyName 文件名,字符串 codeBase,证据 assemblySecurity,程序集 locationHint,StackCrawlMark 和 stackMark,布尔 throwOnFileNotFound,布尔 forIntrospection)

在 System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef,证据 assemblySecurity,StackCrawlMark 和 stackMark,Boolean for Introspection)

在 System.Reflection.Assembly.LoadWithPartialNameInternal(字符串部分名称,证据 securityEvidence,StackCrawlMark 和 stackMark)

在 System.Reflection.Assembly.LoadWithPartialName(字符串部分名称,证据 securityEvidence)

在 System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly(类型类型,字符串 defaultNamespace,XmlSerializerImplementation& 合同)

在 System.Xml.Serialization.XmlSerializer.FromMappings(XmlMapping[] 映射,类型类型) 在 System.Web.Services.Protocols.SoapClientType..ctor(类型类型)

在 System.Web.Services.Protocols.SoapHttpClientProtocol..ctor() 在 cognosdotnet_2_0.reportService1..ctor()

在 ReportRunnerv3.ReportRunner.ExecuteReport(Int32 inPLAN_ID,Int32 inContract_Sfx,字符串 inRptDate_DT,字符串 inPlanType,字符串 inInvstmentOnlyInd,字符串 inMOMInd,字符串 inGPSIInd,字符串 inPBTInd,字符串 inPICAInd,字符串 inClientAccomInd,字符串 inInstSelectInd,字符串 inRptType,Int32 和 outRC)

注释 •cognosdotnetassembly_2_0 与“ReportRunner”程序集位于同一目录中 •cognosdotnetassembly_2_0 使用CREATE ASSEMBLY 进行编目,权限集=不安全 •cognosdotnetassembly_2_0 也安装在GAC 中

以下是 fuslogvw.exe 提供的消息:

*组装活页夹日志条目(8/11/2011 @ 5:57:39 AM)*

操作失败。

绑定结果:hr = 0x80070002。该系统找不到指定的文件。

程序集管理器从以下位置加载:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll

在可执行文件 c:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\Binn\sqlservr.exe 下运行

--- 详细的错误日志如下。

=== 预绑定状态信息 ===

日志:用户 = NT AUTHORITY\NETWORK SERVICE

日志:DisplayName = cognosdotnetassembly_2_0,Version=10.1.4707.501,Culture=neutral,PublicKeyToken=d6e6d7d808b7e5b7(完全指定)

日志:Appbase = file:///c:/Program Files/Microsoft SQL Server/MSSQL10_50.SQLEXPRESS/MSSQL/Binn/

日志:初始 PrivatePath = NULL

日志:动态基础 = NULL

日志:缓存基础 = NULL

日志:AppName = NULL

调用程序集:System.Xml,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089。

===

LOG:此绑定在默认加载上下文中开始。LOG:未找到应用程序配置文件。

LOG:使用来自 c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config 的机器配置文件。

日志:后策略参考:cognosdotnetassembly_2_0,Version=10.1.4707.501,Culture=neutral,PublicKeyToken=d6e6d7d808b7e5b7

LOG:托管 Fusion。检查主机关于这个程序集。

日志:程序集不在 CLR 加载列表中。询问主机组装店。

日志:尝试使用程序集 cognosdotnetassembly_2_0、version=10.1.4707.501、culture=neutral、publickeytoken=d6e6d7d808b7e5b7、processorarchitecture=x86 托管程序集存储。

日志:尝试使用程序集 cognosdotnetassembly_2_0、version=10.1.4707.501、culture=neutral、publickeytoken=d6e6d7d808b7e5b7、processorarchitecture=msil 来托管程序集存储。

日志:尝试使用程序集 cognosdotnetassembly_2_0、version=10.1.4707.501、culture=neutral、publickeytoken=d6e6d7d808b7e5b7 来托管程序集存储。

警告:主机程序集存储不包含此程序集。

ERR:预下载检查期间发生不可恢复的错误(hr = 0x80070002)。

有人可以提供有关为什么 SQL Server 无法找到 cognosdotnetassembly_2_0 的见解吗?

如果您需要更多信息,请告诉我。

感谢你的协助。

- 克里斯

4

1 回答 1

0

我知道这是不久前被问到的,但希望它对将来的某人有所帮助,我将我所知道的包括在内。

这可能与 SQL CLR 系统中内置的安全限制有关。我在尝试在 CLR SQL Sproc 中使用 XML 序列化时遇到了问题,因为(并且您的错误日志也显示了这一点)XML 序列化实际上使用了反射,它需要比普通托管代码更多的安全权限。我猜您能够引用 Cognos 程序集,因为它是通过浏览文件添加的。如果您添加 GAC 程序集,则列表非常有限,我确信它基于特定接口或程序集属性,您正在使用的 Cognos 程序集中未实现或可用。

如果您的 CLR SQL 存储过程以更高的权限级别运行,它可能会起作用。很可能不是。

于 2011-10-10T21:33:00.543 回答