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

C# 在数据库上创建程序集时,部署SQL CLR项目失败,c#,sql,.net,sql-server,sqlclr,C#,Sql,.net,Sql Server,Sqlclr,我在服务器上的文件夹中有一个包含3个dll文件的文件夹,用于创建程序集。我首先尝试了以下代码,但出现了一个错误,说明它在服务器上找不到system.data.datasetextensions.dll文件,我将dll从我的计算机复制并粘贴到clr项目所在的同一文件夹中,然后再次尝试运行该命令 Create Assembly OoplesCLR from 'c:\ooplesclr\OoplesFinanceCLR.dll' with Permission_set = SAFE GO 将dll从

我在服务器上的文件夹中有一个包含3个dll文件的文件夹,用于创建程序集。我首先尝试了以下代码,但出现了一个错误,说明它在服务器上找不到system.data.datasetextensions.dll文件,我将dll从我的计算机复制并粘贴到clr项目所在的同一文件夹中,然后再次尝试运行该命令

Create Assembly OoplesCLR from 'c:\ooplesclr\OoplesFinanceCLR.dll' with Permission_set = SAFE
GO
将dll从我的计算机复制到服务器文件夹后,我现在遇到此错误

Warning: The Microsoft .NET Framework assembly 'system.data.datasetextensions, version=4.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089.' you are registering is not fully tested in the SQL Server hosted environment and is not supported. In the future, if you upgrade or service this assembly or the .NET Framework, your CLR integration routine may stop working. Please refer SQL Server Books Online for more details.
Msg 6218, Level 16, State 2, Line 1
CREATE ASSEMBLY for assembly 'OoplesFinanceCLR' failed because assembly 'System.Data.DataSetExtensions' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database. CLR Verifier error messages if any will follow this message
[ : System.Data.DataRowComparer::get_Default][mdToken=0x6000001][offset 0x00000000] Code size is zero.
[ : System.Data.DataRowComparer`1[TRow]::Equals][mdToken=0x6000004][offset 0x00000000] Code size is zero.
[ : System.Data.DataRowComparer`1[TRow]::GetHashCode][mdToken=0x6000005][offset 0x00000000] Code size is zero.
[ : System.Data.DataRowComparer`1[TRow]::.cctor][mdToken=0x6000006][offset 0x00000000] Code size is zero.
[ : System.Data.DataRowComparer`1[TRow]::.ctor][mdToken=0x6000002][offset 0x00000000] Code size is zero.
[ : System.Data.DataRowComparer`1[TRow]::get_Default][mdToken=0x6000003][offset 0x00000000] Code size is zero.
[ : System.Data.DataTableExtensions::CopyToDataTable[T]][mdToken=0x6000008][offset 0x00000000] Code size is zero.
[ : System.Data.DataTableExtensions::CopyToDataTable[T]][mdToken=0x6000009][offset 0x00000000] Code size is zero.
[ : System.Data.DataTableExtensions::CopyToDataTable[T]][mdToken=0x600000a][offset 0x00000000] Code size is zero.
[ : System.Data.DataTableExtensions::AsDataView[T]][mdToken=0x600000c][offset 0x00000000] Code size is zero.
[ : System.Data.DataTableExtensions::AsEnumerable][mdToken=0x6000007][offset 0x00000000] Code size is zero.
[ : System.Data.DataTableExtensions::AsDataView][mdToken=0x600000b][offset 0x00000000] Code size is zero.
[ : System.Data.EnumerableRowCollection::System.Collections.IEnumerable.GetEnumerator][mdToken=0x600000e][offset 0x00000000] Code size is zero.
[ : System.Data.EnumerableRowCollection::.ctor][mdToken=0x600000d][offset 0x00000000] Code size is zero.
[ : System.Data.EnumerableRowCollection`1[TRow]::System.Collections.IEnumerable.GetEnumerator][mdToken=0x600000f][offset 0x00000000] Code size is zero.
我做错了什么?我怎样才能解决这个问题

更新1:我将数据库更改为Trusty,然后运行此命令,得到相同的错误:

从“c:\ooplesclr\System.Data.DataSetExtensions.dll”创建程序集DataSetExtensions,权限设置为不安全 去

更新2:尝试在同一数据库上创建函数以运行程序集。我的用户定义功能如下:

public partial class UserDefinedFunctions
{
[SqlFunction]
public static SqlString CalculateInfo()
{
    // first get data from the tables and then process the data
    getData();
    // Put your code here
    return new SqlString ("test");
}
更新3:我用以下代码创建的函数没有任何警告或错误,但我无法运行它,因为它说不存在这样的存储过程

GO
CREATE FUNCTION [dbo].[CalculateInfo]
( )
RETURNS NVARCHAR (MAX)
AS
 EXTERNAL NAME [OoplesCLR].[UserDefinedFunctions].[CalculateInfo]
更新4:尽管它说不存在这样的存储过程,但我还是设法运行了它,并得到了以下错误:

Msg 6522, Level 16, State 1, Line 4
在执行用户定义例程或聚合CalculateInfo期间发生.NET Framework错误: System.Security.HostProtectionException:试图执行CLR主机禁止的操作

The protected resources (only available with full trust) were: All
The demanded resources were: Synchronization, ExternalThreading

System.Security.HostProtectionException: 
   at UserDefinedFunctions.getData()
   at UserDefinedFunctions.CalculateInfo()

如何修复此异常?

首先,只支持一小部分.NET Framework库。您可以在的MSDN页面上找到该列表。System.Data.DataSetExtensions不是其中之一。这就是为什么你会犯第一个错误

发布的第二件事是警告,而不是错误。它告诉你,当你做一些不受支持的事情时,你可能会遇到一个或多个微软不会关心或修复的问题

在部署程序集的数据库中运行以下操作:

SELECT * FROM sys.assemblies sa WHERE sa.is_user_defined = 1;
你应该看到两者。尽管System.Data.DataSetExtensions具有依赖库,但不会自动加载这些库,因为只有初始创建程序集指向的文件夹才会加载,而此时正在生成DLL,而不是.NET Framework文件夹

您最好将System.Data.DataSetExtensions自行加载到指向相应C:\Windows\Microsoft.NET\Framework或Framework64文件夹的自己的创建程序集中。特别是如果您注意到错误消息显示代码大小为零,这是我仅在尝试从引用程序集文件夹之一加载DLL时看到的

现在,因为这是一个不受支持的库,它可能会做一些不允许安全加载的事情。由于我们没有私钥信息,因此无法按照理想的方式创建非对称密钥,然后基于该非对称密钥登录,因此您别无选择,只能:

通过以下方式将要部署到的数据库设置为可信:

ALTER DATABASE [DatabaseName] SET TRUSTWORTHY ON;
加载权限设置为不安全的程序集 基本上:

使用[数据库名称]; 更改数据库当前设置是否可信; 创建程序集[System.Data.DataSetExtensions] 从…起 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Data.DataSetExtensions.dll' 权限设置为不安全; 之后,您应该能够加载程序集,尽管它可能也必须设置为不安全

我会删除你放在构建文件夹中的System.Data.DataSetExtensions.dll的副本


有关SQLCLR的更多信息,请参阅我在SQL Server Central上编写的系列文章:需要免费注册。

这个问题有问题吗?我假设第一段中的错误记录了您在第二段中使用SQLCLR DLL将DLL复制到文件夹后得到的结果,对吗?那么这将部署在哪个版本的SQL Server上?@srutzky是的,我直到现在才注意到这个问题出了问题。但是你是对的,我运行了这个查询,没有看到任何东西。我更新了我的问题以显示我所做的更改,我仍然得到相同的结果error@user3610374我只是更新了一下,提到了这个问题。代码大小为零我相信只有在尝试加载引用程序集而不是真正的程序集时才会发生。我的最后一个问题是如何在数据库上运行我的函数?我正在读一篇文章,上面说要为程序集创建一个函数,但没有给我一个例子我终于能够创建程序集了。现在我只是想弄清楚如何在数据库上创建一个函数来运行代码