我已经深入研究SQL clr编程。不幸的是,我的第一次尝试很困难。 我的C#汇编代码就是这样:
enter code here
public partial class FirstCLRRoutines
{
public static int GetCLRFrameworkMajorVersion()
{
return System.Environment.Version.Major;
}
}
SQL代码是:
USE master
GO
CREATE ASSEMBLY [Chapter2.FirstCLRRoutine]
FROM 'D:\projeler\SQL_CLR\SQL_CLR\bin\Debug\SQL_CLR.dll'
但是我从MSSMSE收到此错误消息:
Msg 6218,Level 16,State 3,Line 1
程序集“SQL_CLR”的CREATE ASSEMBLY失败,因为程序集“SQL_CLR”验证失败。检查引用的程序集是否正确 执行中的最新和可信(for external_access或unsafe) 数据库。 CLR Verifier错误消息(如果有)将遵循此 消息
答案 0 :(得分:36)
我刚刚遇到了同样的问题。
这是一个旧页面,但首先是formost,最后,DLL 必须使用.NET 2.0构建。 SqlServer 2005是使用.net 2.0构建的,因为它是编写时的最新版本。 SqlServer 2008也可能存在同样的问题。
DLL和SqlServer必须都引用相同的.NET framekwork版本。一旦我想到了这一点,我在2.0和shazam下创建了一个单独的项目!第一次工作很完美。
要查看您的sql server使用的.net版本:
select * from sys.dm_clr_properties
答案 1 :(得分:8)
接受的答案,虽然似乎解决了O.P.的问题,但只是部分正确,并且对潜在原因提出了过于简单的解释,这可能导致其他人在错误的方向上遇到类似的问题。
接受答案的问题是对.NET环境的误解,同样的误解也可以在问题本身中看到。在.NET中,CLR和Framework是两个独立的东西,每个都有自己的版本。
CLR(公共语言运行时)是执行托管代码的。这几乎不像框架那样经常更新。 .NET Framework是一组库,它提供了与特定版本的CLR交互的基本方法。
CLR的单个版本通常具有与其一起使用的框架的多个版本。但是,单个版本的Framework仅适用于CLR的一个特定版本。例如,CLR版本2.0适用于Framework版本2.0,3.0和3.5,而CLR版本4.0适用于.NET Framework的所有4.x版本(即4.0,4.5,4.5.1,4.5.2,4.6)等)。要查看CLR版本与Framework版本关系的图表,请参阅.NET Framework Versions and Dependencies的MSDN页面。
关于SQLCLR代码,SQL Server仅适用于单个版本的CLR,特定版本取决于SQL Server的版本。 SQL Server 2005,2008和2008 R2仅适用于CLR版本2.由于CLR版本2仅适用于.NET Framework版本2.0,3.0和3.5,这意味着SQL Server 2005,2008和2008 R2仅适用于。 NET Framework版本2.0,3.0和3.5。当然,SQL Server 2005只包含.NET Framework 2.0版,因此在.NET Framework 3.0和3.5版中有一些较新的库在SQL Server 2005中无法运行而无需手动导入它们(即 System.Core 和 System.Xml.Linq )。同样,SQL Server 2012,2014和2016静态链接到CLR版本4,后者适用于.NET Framework版本4.0,4.5,4.5.1,4.5.2,4.6。
关于System.Environment.Version
(问题中)和sys.dm_clr_properties.version
(已接受的答案)中返回的信息,他们报告的是 CLR 版本,不 框架版本。因此,请注意不要将报告2.0或4.0的两件事混淆为意味着您只能使用Framework 2.0或4.0版。
幸运的是,由于向后兼容性,针对CLR 2 Framework版本(2.0,3.0和3.5)编译的代码将运行,而无需在SQL Server 2012及更高版本中重新编译,即使它们位于CLR版本4上。
因此,使用Target Framework Version 2.0时通常不会出错,但是你肯定可以使用超过2.0的Framework版本。
要更深入地了解开发SQLCLR代码,请查看我写的以下文章(以及一般系列文章):
Stairway to SQLCLR Level 5: Development (Using .NET within SQL Server)
答案 2 :(得分:4)
USE master
GO
CREATE ASSEMBLY [Chapter2.FirstCLRRoutine]
FROM 'D:\projeler\SQL_CLR\SQL_CLR\bin\Debug\SQL_CLR.dll'
WITH PERMISSION_SET = UNSAFE
尝试一下,如果有效,请告诉我。
答案 3 :(得分:0)
CLR不支持库System.Environment: http://msdn.microsoft.com/en-us/library/ms403279.aspx
您仍然可以使用它,如上文“不支持的库”部分所示,但请记住,代码尚未经过安全性和可靠性测试。这可能会在生产环境中造成不可预测的结果,因此请在部署之前考虑风险并仔细测试。
此外,我认为它必须具有强名称,或者在执行之前部署到标记为“可信赖”的数据库。
答案 4 :(得分:0)
简短回答: 在项目属性上设置Sql Server版本和.Net Framework版本。
首先,您必须检查设置项目属性。在project属性中设置要为其创建CLR的sql server的版本。然后选择.Net Framework版本。例如,如果要为SQL Server 2008创建CLR,则必须将.Net Framework设置为3.5,而将2005设置为.Net 2.0。 我希望这个解决方案可以帮助你。