2

我编写了一个需要从存储过程调用的 C# DLL。

我在执行的所有步骤中都遇到了错误,并设法解决了它们。但现在我厌倦了错误,我不得不在这里求助。我解决不了这个。我在将这个 .DLL 安装到 SQL Server 中所做的每一个小步骤,我都有大量的错误需要解决。

这是程序的 C# 代码(编译为类库以获取 DLL):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Xml;
using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

namespace WebServiceVatEuropa
{
    public class WebServiceVatEuropaClass
    {
        #region "Default Constructor"
        public WebServiceVatEuropaClass()
        {

        }
        #endregion

        [SqlProcedure]
        public static void check(string country, string vatNum)
        {
            bool valid;
            string name;
            string address;
            checkVatService vatchecker = new checkVatService();
            vatchecker.checkVat(ref country, ref vatNum, out valid, out name, out address);
        }
    }
}

哪个使用欧洲增值税检查网络服务提供的另一个免费库(链接到网络服务)并使用他们的库(库代码)(这个代码很长而且很复杂,我猜你可以阅读我的。

出色地。我在 SQL Server Management Studio 中使用以下代码创建了存储过程(我在这里遇到了很多问题,很多错误等等,但现在它可以工作了):

CREATE PROCEDURE VAT_CHECKER
@Naz_codi nvarchar(2),
@vatNum nvarchar(max)
AS EXTERNAL NAME WebServiceVatEuropaClass.[WebServiceVatEuropa.WebServiceVatEuropaClass].[check]
GO

然后在数据库中我有:

  1. 使用来自 msn 的代码启用 clr

    sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    sp_configure 'clr enabled', 1;
    GO
    RECONFIGURE;
    GO
    
  2. 将数据库所有者更改为 sa

  3. 使用此代码注册程序集

    CREATE ASSEMBLY [WebServiceVatEuropaClass] --AUTHORIZATION [mydb\administrator]
    FROM 'C:\Upload\WebServiceVatEuropa.dll'
    --WITH PERMISSION_SET = SAFE
    WITH PERMISSION_SET = UNSAFE
    --WITH PERMISSION_SET = EXTERNAL_ACCESS
    

然后当我启动

EXEC VAT_CHECKER 'IT','10050721009'

我收到此错误:

尝试加载程序集 id 65545 时,Microsoft .NET Framework 中发生错误。服务器可能资源不足,或者程序集可能不受 PERMISSION_SET = EXTERNAL_ACCESS 或 UNSAFE 的信任。再次运行查询,或查看文档以了解如何解决程序集信任问题。有关此错误的更多信息:System.IO.FileLoadException:无法加载文件或程序集“webservicevateuropa,版本=0.0.0.0,文化=中性,PublicKeyToken=null”或其依赖项之一。给定的程序集名称或代码库无效。(来自 HRESULT 的异常:0x80131047)

System.IO.FileLoadException:
在 System.Reflection.Assembly._nLoad(AssemblyName fileName,String codeBase,证据 assemblySecurity,Assembly locationHint,StackCrawlMark 和 stackMark,布尔 throwOnFileNotFound,Boolean forIntrospection)
在 System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef,证据 assemblySecurity , StackCrawlMark& stackMark, Boolean forIntrospection)
在 System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
在 System.Reflection.Assembly.Load(String assemblyString)

它可能是什么?我找不到任何东西来修复它...

4

2 回答 2

1

错误消息基本上告诉了您所有信息 - 由于您的程序集正在访问并访问外部 Web 服务,因此您必须将其配置为EXTERNAL_ACCESS.

您并没有展示如何在 SQL Server 中创建程序集 - 但基本上,您需要使用以下内容:

CREATE ASSEMBLY assembly_name
FROM ...(your assembly).....
WITH PERMISSION_SET = { EXTERNAL_ACCESS }

你是这样做的吗?EXTERNAL_ACCESS如果没有:请使用权限集重试!

有关更多详细信息,请参阅有关代码访问安全性的 MSDN 文档

于 2013-07-22T15:51:47.737 回答
1

所以,终于,我设法解决了这个问题(我简直不敢相信)。

这是我所做的:

- 代码与上述基本相同。

-我试图在远程桌面计算机上的 SQL Server 2005 上部署 dll,但我使用 Visual Studio 2010 在本地编译它。也许这是一个问题,或者也许不是。但我切换到安装在远程桌面机器上的 Visual Studio 2008 副本。我在一些网站上读到,Visual Studio 中不同的目标架构编译设置会产生与我类似的问题。

-正如我所说,在将这个程序集部署到 SQL Server 实例的任务中,我执行的每一步都出现错误。而这一次也不例外。我在远程桌面机器上编译后,它又给出了一个关于 XmlSerialization 的错误。

注意:我需要XmlSerializers的特殊原因是因为我正在使用一个使用 Xml 和 C# Xml 对象来操作数据的 Web 服务,因此 Xml 参与了该程序。我不知道您在其他情况下是否需要 XmlSerializers,但在这种特殊情况下,我需要它,否则 SQL 服务器会给我明显的错误。

此处解释了此特定问题的解决方案:

Xml 序列化问题

我通过更改文章中显示的编译设置来生成这个额外的 dll 来解决。

- 这结束了我在 Visual Studio 中必须做的事情。

现在它启动 SQL 部分:

  • 我必须为我自己的 DLL 和 XmlSerialization 创建一个程序集。

    CREATE ASSEMBLY [WebServiceVatEuropaClass] --AUTHORIZATION [mydb\administrator]
    FROM 'C:\Upload\WebServiceVatEuropa.dll'
    --WITH PERMISSION_SET = SAFE
    WITH PERMISSION_SET = UNSAFE
    --WITH PERMISSION_SET = EXTERNAL_ACCESS
    
    
    
    CREATE ASSEMBLY [WebServiceVatEuropaClassXmlSerializers] --AUTHORIZATION [mydb\administrator]
    FROM 'C:\Upload\WebServiceVatEuropa.XmlSerializers.dll'
    --WITH PERMISSION_SET = SAFE
    WITH PERMISSION_SET = UNSAFE
    --WITH PERMISSION_SET = EXTERNAL_ACCESS
    

注意:可能因为问题不是权限(尽管 Sql server 给了我完全误导的 SAFE/EXTERNAL 权限错误消息),将程序集权限设置为 EXTERNAL 而不是 UNSAFE 可能就足够了。我这样说只是因为如果不是严格需要,您可能不希望允许 UNSAFE 许可,因为整个过程非常不安全(如果我通过在互联网上阅读很好地记录了自己),即使使用非对称密钥,也有人可以替换您的程序集

然后我创建了用于调用程序集的存储过程(与上述问题中的代码相同),这一次当我调用 EXEC 时,它工作了!

希望这对其有同样问题的其他人有用。

于 2013-08-01T22:23:17.480 回答