Не удалось СОЗДАТЬ СБОРКУ в 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, если они будут следовать сообщение
Ответы
Ответ 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.
Я надеюсь, что это решение поможет вам.