我编写了一个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);
}
}
}
使用欧洲大桶检查webservice(Link to webservice)提供的另一个免费库并使用他们的库(Library code)(这段代码很长很复杂,你可以读我的猜测。
好。我在SQL Server Management Studio中使用此代码创建存储过程(我在这里遇到很多问题,许多错误,但现在它可以工作):
CREATE PROCEDURE VAT_CHECKER
@Naz_codi nvarchar(2),
@vatNum nvarchar(max)
AS EXTERNAL NAME WebServiceVatEuropaClass.[WebServiceVatEuropa.WebServiceVatEuropaClass].[check]
GO
然后在数据库中我有:
使用msn
中的代码启用clrsp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
将数据库所有者更改为sa
使用此代码注册程序集
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,Evidence assemblySecurity,Assembly locationHint, StackCrawlMark&安培; stackMark,Boolean throwOnFileNotFound,Boolean forIntrospection)
在System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, 证据集合安全,StackCrawlMark& stackMark,布尔 forIntrospection)
在System.Reflection.Assembly.InternalLoad(String assemblyString,Evidence assemblySecurity,StackCrawlMark& stackMark,Boolean forIntrospection)
在System.Reflection.Assembly.Load(String assemblyString)
它可能是什么?我找不到任何解决方法......
答案 0 :(得分:1)
错误消息基本上告诉您所有内容 - 由于您的程序集已联系并访问外部Web服务,因此您必须将其配置为EXTERNAL_ACCESS
。
您没有展示如何在SQL Server中创建程序集 - 但基本上,您需要使用以下内容:
CREATE ASSEMBLY assembly_name
FROM ...(your assembly).....
WITH PERMISSION_SET = { EXTERNAL_ACCESS }
你是这样做的吗?如果不是:请使用EXTERNAL_ACCESS
权限设置再次尝试!
答案 1 :(得分:1)
所以,最后,我设法解决了这个问题(我无法相信)。
这就是我的所作所为:
- 代码与上面大致相同。
- 我试图在远程桌面计算机上的SQL Server 2005上部署dll,但我正在使用Visual Studio 2010在本地编译它。可能这是一个问题,或者可能不是。但我切换到安装在远程桌面计算机上的Visual Studio 2008副本。我在一些网站上读到,Visual Studio中不同的目标体系结构编译设置可能会产生类似于我的问题。
- 正如我所说,在我将此程序集部署到SQL Server实例的任务中所做的每一步,我都遇到了错误。而这一次也没有什么不同。在远程桌面计算机上编译它之后,它给出了另一个关于XmlSerialization的错误。
注意:因为我需要 XmlSerializers的特殊原因是因为我正在使用一个使用Xml和C#Xml对象操作数据的Web服务,因此Xml参与了该程序。我不知道你是否需要XmlSerializers在其他情况下,但在这种特殊情况下我需要它,否则SQL服务器会给我一些开放的错误。
此处解释了此特定问题的解决方案:
通过更改文章中显示的编译设置来生成这个额外的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许可,因为整个过程非常不安全(如果我通过互联网阅读记录得很好),即使使用非对称密钥,也有人可以更换你的程序集
然后我创建了Stored过程来调用(在问题中与上面相同的代码)程序集,这次当我调用EXEC时,它已经工作了!
希望这对遇到同样问题的其他人有用。