Подтвердить что ты не робот

Не удалось СОЗДАТЬ СБОРКУ в SQL

Я уже нырнул в программирование SQL clr. К сожалению, моя первая попытка смущена. Мой код сборки С# выглядит так:

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, уровень 16, состояние 3, строка 1
CREATE ASSEMBLY для сборки "SQL_CLR" не удалось, потому что сборка "SQL_CLR" не прошла проверку. Проверьте, соответствуют ли ссылочные сборки обновленный и надежный (для external_access или небезопасный) для выполнения в базы данных. Сообщения об ошибках CLR Verifier, если они будут следовать сообщение

4b9b3361

Ответ 1

Я столкнулся с одной и той же проблемой.

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

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

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

select * from sys.dm_clr_properties

Ответ 2

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

Проблема с принятым ответом - непонимание среды .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 работает со всеми версиями версии 4.x.NET Framework (то есть 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.

Таким образом, вы, как правило, не ошибетесь в использовании целевой версии 2.0, но вы, безусловно, можете использовать версии Framework за пределами 2.0.

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

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

Ответ 3

USE master 
GO 
CREATE ASSEMBLY [Chapter2.FirstCLRRoutine] 
FROM 'D:\projeler\SQL_CLR\SQL_CLR\bin\Debug\SQL_CLR.dll' 
WITH PERMISSION_SET = UNSAFE

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

Ответ 4

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

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

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

Ответ 5

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

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