当前位置: 首页 > 编程语言 > C#

在数据库上创建程序集时,部署SQL CLR项目失败分享

时间:2023-04-11 03:28:17 C#

C#学习教程:在数据库上创建程序集时部署SQLCLR项目失败.我首先尝试了以下代码并收到错误消息说它无法在服务器上找到system.data.datasetextensions.dll文件,我将dll从我的计算机复制并粘贴到我的clr项目所在的同一文件夹中并尝试运行再次命令。CreateAssemblyOoplesCLRfrom'c:ooplesclrOoplesFinanceCLR.dll'withPermission_set=SAFEGO将dll从我的计算机复制到服务器文件夹后,我现在收到这个错误Warning:TheMicrosoft.NETFrameworkassembly'system.data.datasetextensions,版本=4.0.0.0,文化=中性,publickeytoken=b77a5c561934e089。'您正在注册的应用程序未在SQLServer托管环境中经过全面测试,因此不受支持。将来,如果升级或维护此程序集或.NETFramework,您的CLR集成例程可能会停止工作。有关详细信息,请参阅SQLServer联机丛书。消息6218,级别16,状态2,第1行为程序集“OoplesFinanceCLR”创建程序集失败,因为程序集“System.Data.DataSetExtensions”验证失败。检查引用的程序集是否是最新的和可信的(对于external_access或不安全的)在数据库中执行。CLR验证程序错误消息(如果有)将跟随此消息[:System.Data.DataRowComparer::get_Default][mdToken=0x6000001][offset0x00000000]代码大小为零。[:System.Data.DataRowComparer`1[TRow]::Equals][mdToken=0x6000004][offset0x00000000]代码大小为零。[:System.Data.DataRowComparer`1[TRow]::GetHashCode][mdToken=0x6000005][offset0x00000000]代码大小为零。[:System.Data.DataRowComparer`1[TRow]::.cctor][mdToken=0x6000006][offset0x00000000]代码大小为零。[:System.Data.DataRowComparer`1[TRow]::.ctor][mdToken=0x6000002][offset0x00000000]代码大小为零。[:System.Data.DataRowComparer`1[TRow]::get_Default][mdToken=0x6000003][offset0x00000000]代码大小为零。[:System.Data.DataTableExtensions::CopyToDataTable[T]][mdToken=0x6000008][offset0x00000000]代码大小为零。[:System.Data.DataTableExtensions::CopyToDataTable[T]][mdToken=0x6000009][offset0x00000000]代码大小为零。[:System.Data.DataTableExtensions::CopyToDataTable[T]][mdToken=0x600000a][offset0x00000000]代码大小为零。[:System.Data.DataTableExtensions::AsDataView[T]][mdToken=0x600000c][offset0x00000000]代码大小为零。[:System.Data.DataTableExtensions::AsEnumerable][mdToken=0x6000007][offset0x00000000]代码大小为零。[:系统数据。DataTableExtensions::AsDataView][mdToken=0x600000b][offset0x00000000]代码大小为零。[:System.Data.EnumerableRowCollection::.ctor][mdToken=0x600000d][offset0x00000000]代码大小为零。[:System.Data.EnumerableRowCollection`1[TRow]::System.Collections.IEnumerable.GetEnumerator][mdToken=0x600000f][offset0x00000000]代码大小为零。我做错了什么,我该如何解决?更新1:我将数据库更改为受信任的,然后运行此命令,我得到了同样的错误:CreateassemblyDataSetExtensionsfrom'c:ooplesclrSystem.Data.DataSetExtensions.dll'withPermission_set=UNSAFEGOUPDATE2:TriedinCreateafunctionon运行程序集的相同数据库我的用户定义函数如下所示:publicpartialclassUserDefinedFunctions{[SqlFunction]publicstaticSqlStringCalculateInfo(){//首先从表中获取数据然后处理数据//把你的代码放在这里returnnewSqlString("test");更新3:我使用以下代码创建函数,没有任何警告或错误,但我无法运行它,因为它说不存在这样的存储过程...GOCREATEFUNCTION[dbo].[CalculateInfo]()RETURNSNVARCHAR(MAX)ASEXTERNALNAME[OoplesCLR].[UserDefinedFunctions].[CalculateInfo]更新4:即使它说不存在这样的存储过程,我还是设法运行了它,但出现以下错误:消息6522,级别16,状态1,第4行在执行用户定义的例程或聚合“CalculateInfo”期间发生.NETFramework错误:System.Security.HostProtectionException:试图执行CLR主机禁止的操作。受保护的资源(仅在完全信任的情况下可用)是:所有需要的资源是:同步、外部线程System.Security.HostProtectionException:atUserDefinedFunctions.getData()atUserDefinedFunctions.CalculateInfo()如何修复此异常?首先,只有一小部分.NETFramework库是“受支持的”。您可以在MSDN页面上找到支持的.NETFramework库的列表。System.Data.DataSetExtensions不是其中之一。这就是你得到第一个错误的原因。发布的第二件事是警告,而不是错误。它告诉您,当您执行不受支持的操作时,您可能会遇到Microsoft不关心或不修复的一个或多个问题。在要部署程序集的数据库中运行以下命令:SELECT*FROMsys.assembliessaWHEREsa.is_user_defined=1;你应该看到两者。尽管System.Data.DataSetExtensions有依赖库,但它们不会自动加载,因为只会加载初始CREATEASSEMBLY指向的文件夹,现在是您构建DLL的位置,而不是.NETFramework文件夹。您最好在自己的CREATEASSEMBLY中加载System.Data.DataSetExtensions,指向相应的C:\Windows\Microsoft.NETFramework(或Framework64)文件夹。特别是如果您注意到错误消息显示“代码大小为零”,这是我在尝试从参考程序集文件夹之一加载DLL时看到的。现在,由于这是一个不受支持的库,它可能正在做一些不允许它作为安全加载的事情。由于我们没有私钥信息作为创建非对称密钥然后基于该非对称密钥登录的完美路径,因此您别无选择,只能:本质上:使用[DatabaseName];ALTERDATABASECURRENTSETTRUSWORTHYON;CREATEASSEMBLY[System.Data.DataSetExtensions]FROM'C:WindowsMicrosoft.NETFramework64v4.0.30319System.Data.DataSetExtensions.dll'WITHPERMISSION_SET=UNSAFE;之后您应该能够加载您的程序集,尽管它可能还必须设置为UNSAFE。我会删除您放入构建文件夹中的System.Data.DataSetExtensions.dll副本。有关SQLCLR的更多信息,请参阅我的SQLServerCentral系列:SQLCLR的阶梯(需要免费注册)。以上是C#学习教程:在数据库上创建程序集时,部署SQLCLR项目失败共享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: