Не удалось СОЗДАТЬ СБОРКУ в SQL - PullRequest
20 голосов
/ 01 ноября 2011

Я уже погрузился в программирование 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:

Сообщение 6218, уровень 16, состояние 3, строка 1
CREATE ASSEMBLY для сборки «SQL_CLR» не выполнен, поскольку сборка «SQL_CLR» не прошла проверку. Проверьте, являются ли указанные сборки актуальный и доверенный (для external_access или unsafe) для выполнения в база данных. Сообщения об ошибках CLR Verifier, если таковые будут следовать за этим сообщение

Ответы [ 5 ]

36 голосов
/ 17 мая 2012

Я только что столкнулся с точно такой же проблемой.

Это старая страница, но сначала, скорее всего, и наконец, DLL должна быть построена с .NET 2.0. SqlServer 2005 построен на .net 2.0, потому что это последний доступный на момент написания. SqlServer 2008 также может иметь ту же проблему.

DLL и SqlServer должны ссылаться на одну и ту же версию фреймворка .NET. Как только я понял это, я создал отдельный проект под 2.0 и Shazam! работал отлично с первого раза.

Чтобы узнать, какую версию .net использует ваш sql-сервер:

select * from sys.dm_clr_properties
8 голосов
/ 01 сентября 2015

Принятый ответ, хотя и разрешающий проблему ОП, является только частично правильным и представляет слишком упрощенное объяснение первопричины, которая может привести других людей с подобной проблемой в неправильном направлении.

Проблема с принятым ответом - неправильное понимание среды .NET, и то же самое недоразумение можно увидеть и в самом Вопросе.В .NET CLR и Framework - это две разные вещи, каждая со своими версиями.

CLR (Common Language Runtime) - это то, что выполняет управляемый код.Это обновляется не так часто, как Framework..NET Framework - это набор библиотек, которые предоставляют основные средства взаимодействия с конкретной версией CLR.

Одна версия CLR обычно имеет несколько версий Framework, с которыми она работает.Однако одна версия 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 verion к версии Framework, см. Страницу MSDN для .NET Framework Версии и зависимости .

Что касается кода 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 , не Framework версия.Поэтому будьте осторожны, чтобы не путать эти две вещи, сообщающие о 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 версии 2.0,но вы наверняка можете использовать версии Framework выше 2.0.

Для более глубокого взгляда на разработку кода SQLCLR ознакомьтесь со следующей статьей (и серией в целом), которую я написал:

Лестница в SQLCLR Уровень 5: Разработка (Использование .NET в SQL Server)

4 голосов
/ 01 ноября 2011
USE master 
GO 
CREATE ASSEMBLY [Chapter2.FirstCLRRoutine] 
FROM 'D:\projeler\SQL_CLR\SQL_CLR\bin\Debug\SQL_CLR.dll' 
WITH PERMISSION_SET = UNSAFE

Попробуйте, и дайте мне знать, если это работает.

0 голосов
/ 09 декабря 2015

Краткий ответ: установить версию Sql Server и .Net Framework в свойстве проекта.

Прежде всего, вы должны проверить установить свойство вашего проекта. в свойстве проекта укажите версию сервера sql, для которой вы хотите создать CLR. затем выберите версию .Net Framework. например, если вы хотите создать CLR для SQL Server 2008, вам нужно установить .Net Framework на 3.5 и на 2005 год выбрать .Net 2.0. Я надеюсь, что это решение поможет вам.

0 голосов
/ 01 ноября 2011

Библиотека System.Environment не поддерживается для CLR: http://msdn.microsoft.com/en-us/library/ms403279.aspx

Вы все еще можете использовать ее, как указано в разделе «Неподдерживаемые библиотеки» статьи выше, но имейте в виду, чтокод не был проверен на безопасность и надежность.Это может привести к непредсказуемым результатам в производственной среде, поэтому подумайте о рисках и тщательно протестируйте их перед развертыванием.

Кроме того, я считаю, что оно должно иметь строгое имя или быть развернуто в базе данных, помеченной как «Надежная»до того, как он будет выполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...