gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:24:16 25 4
gpt4 key购买 nike

我在用于创建程序集的服务器上的文件夹中有一个包含 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:我将数据库更改为可信数据库,然后运行此命令,但我遇到了同样的错误:

使用 Permission_set = UNSAFE 从 '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 库是“受支持的”。您可以在 Supported .NET Framework Libraries 的 MSDN 页面上找到该列表. System.Data.DataSetExtensions 不是其中之一。这就是您遇到第一个错误的原因。

张贴的第二件事是警告,而不是错误。它告诉您,您可能会遇到 Microsoft 不会关心或修复的一个或多个问题,因为您正在做不受支持的事情。

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

SELECT * FROM sys.assemblies sa WHERE sa.is_user_defined = 1;

你应该看到两者。虽然如果 System.Data.DataSetExtensions 有依赖库,它们不会被自动加载,因为只有初始 CREATE ASSEMBLY 指向的文件夹会被加载,并且现在是构建 DLL 的位置,而不是 .NET Framework 文件夹。

您最好在其自己的 CREATE ASSEMBLY 中加载 System.Data.DataSetExtensions 并指向适当的 C:\Windows\Microsoft.NET\Framework(或 Framework64) 文件夹。特别是如果您注意到错误消息显示“代码大小为零”,我只在尝试从 Reference Assemblies 文件夹之一加载 DLL 时才看到。

现在,因为这是一个不受支持的库,它可能会做一些不允许将其加载为 SAFE 的事情。由于我们没有私钥信息来创建非对称 key 然后基于该非对称 key 登录的理想路线,您别无选择,只能:

  • 通过以下方式将您要部署到的数据库设置为 TRUSTWORTHY:

    ALTER DATABASE [DatabaseName] SET TRUSTWORTHY ON;
  • 加载程序集 WITH PERMISSION_SET = UNSAFE

本质上:

USE [DatabaseName];

ALTER DATABASE CURRENT SET TRUSTWORTHY ON;

CREATE ASSEMBLY [System.Data.DataSetExtensions]
FROM
'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Data.DataSetExtensions.dll'
WITH PERMISSION_SET = UNSAFE;

之后您应该能够加载您的程序集,尽管它可能还必须设置为 UNSAFE

我会删除您放入构建文件夹中的 System.Data.DataSetExtensions.dll 副本。


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

关于c# - 在数据库上创建程序集时部署 SQL CLR 项目失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28268373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com