2015-02-01 4 views
1

У меня есть папка с 3 DLL-файлами в папке на сервере, которую я использую для создания сборки. Сначала я попробовал следующий код и получил сообщение об ошибке, в котором говорилось, что он не может найти файл system.data.datasetextensions.dll на сервере, и я скопировал и вставил dll с моего компьютера в ту же папку, где находился мой проект clr и снова попытался запустить команду.Развертывание проекта SQL CLR сбой при создании сборки в базе данных

Create Assembly OoplesCLR from 'c:\ooplesclr\OoplesFinanceCLR.dll' with Permission_set = SAFE 
GO 

Я теперь получаю эту ошибку после копирования DLL с моего компьютера в серверную папку

Warning: The Microsoft .NET Framework assembly 'system.data.datasetextensions, version=4.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089.' you are registering is not fully tested in the SQL Server hosted environment and is not supported. In the future, if you upgrade or service this assembly or the .NET Framework, your CLR integration routine may stop working. Please refer SQL Server Books Online for more details. 
Msg 6218, Level 16, State 2, Line 1 
CREATE ASSEMBLY for assembly 'OoplesFinanceCLR' failed because assembly 'System.Data.DataSetExtensions' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database. CLR Verifier error messages if any will follow this message 
[ : System.Data.DataRowComparer::get_Default][mdToken=0x6000001][offset 0x00000000] Code size is zero. 
[ : System.Data.DataRowComparer`1[TRow]::Equals][mdToken=0x6000004][offset 0x00000000] Code size is zero. 
[ : System.Data.DataRowComparer`1[TRow]::GetHashCode][mdToken=0x6000005][offset 0x00000000] Code size is zero. 
[ : System.Data.DataRowComparer`1[TRow]::.cctor][mdToken=0x6000006][offset 0x00000000] Code size is zero. 
[ : System.Data.DataRowComparer`1[TRow]::.ctor][mdToken=0x6000002][offset 0x00000000] Code size is zero. 
[ : System.Data.DataRowComparer`1[TRow]::get_Default][mdToken=0x6000003][offset 0x00000000] Code size is zero. 
[ : System.Data.DataTableExtensions::CopyToDataTable[T]][mdToken=0x6000008][offset 0x00000000] Code size is zero. 
[ : System.Data.DataTableExtensions::CopyToDataTable[T]][mdToken=0x6000009][offset 0x00000000] Code size is zero. 
[ : System.Data.DataTableExtensions::CopyToDataTable[T]][mdToken=0x600000a][offset 0x00000000] Code size is zero. 
[ : System.Data.DataTableExtensions::AsDataView[T]][mdToken=0x600000c][offset 0x00000000] Code size is zero. 
[ : System.Data.DataTableExtensions::AsEnumerable][mdToken=0x6000007][offset 0x00000000] Code size is zero. 
[ : System.Data.DataTableExtensions::AsDataView][mdToken=0x600000b][offset 0x00000000] Code size is zero. 
[ : System.Data.EnumerableRowCollection::System.Collections.IEnumerable.GetEnumerator][mdToken=0x600000e][offset 0x00000000] Code size is zero. 
[ : System.Data.EnumerableRowCollection::.ctor][mdToken=0x600000d][offset 0x00000000] Code size is zero. 
[ : System.Data.EnumerableRowCollection`1[TRow]::System.Collections.IEnumerable.GetEnumerator][mdToken=0x600000f][offset 0x00000000] Code size is zero. 

Что я делаю неправильно и как я могу это исправить?

UPDATE 1: Я изменил базу данных, заслуживающим доверия, а затем запустил эту команду, и я получаю ту же ошибку:

Создать DataSetExtensions Assembly из «C: \ ooplesclr \ System.Data.DataSetExtensions.dll» с Permission_set = UNSAFE GO

ОБНОВЛЕНИЕ 2: Попытка создать функцию в той же базе данных для запуска сборки. Моя определена пользовательская функция заключается в следующем:

public partial class UserDefinedFunctions 
{ 
[SqlFunction] 
public static SqlString CalculateInfo() 
{ 
    // first get data from the tables and then process the data 
    getData(); 
    // Put your code here 
    return new SqlString ("test"); 
} 

UPDATE 3: Я создал функцию без каких-либо предупреждений или ошибок с помощью следующего кода, но я не могу запустить его, потому что он говорит, что нет такой хранимой процедуры не существует ...

GO 
CREATE FUNCTION [dbo].[CalculateInfo] 
() 
RETURNS NVARCHAR (MAX) 
AS 
EXTERNAL NAME [OoplesCLR].[UserDefinedFunctions].[CalculateInfo] 

UPDATE 4: Даже если он говорит нет такой хранимой процедуры не существует, мне удалось запустить его, и я получаю следующее сообщение об ошибке:

Msg 6522, Level 16, State 1, Line 4 
произошла

приложения .NET Framework ошибки во время выполнение пользовательской подпрограммы или агрегата «CalculateInfo»: System.Security.HostProtectionException: Попытка выполнить операцию, которая была запрещена узлом CLR.

The protected resources (only available with full trust) were: All 
The demanded resources were: Synchronization, ExternalThreading 

System.Security.HostProtectionException: 
    at UserDefinedFunctions.getData() 
    at UserDefinedFunctions.CalculateInfo() 

Как исправить это исключение?

+0

Вопрос не в порядке? Я предполагаю, что ошибка, отмеченная в первом абзаце, что вы получили после того, как скопировали эту DLL в папку со своей библиотекой SQLCLR во втором абзаце, не так ли? И какая версия SQL Server будет развернута? –

+0

@srutzky Да, я до сих пор не замечал, что вопрос вышел из строя. Но да, вы правы – user3610374

ответ

3

Во-первых, поддерживается только короткий список библиотек .NET Framework. Этот список можно найти на странице MSDN для Supported .NET Framework Libraries. System.Data.DataSetExtensions не является одним из них. Вот почему вы получили первую ошибку.

Второе отправленное сообщение - предупреждение, а не ошибка. Он говорит вам, что вы можете столкнуться с одной или несколькими проблемами, которые Microsoft не будет волновать или исправить, поскольку вы делаете что-то неподдерживаемое.

Выполните следующие действия в базе данных, где выполняется развертывание сборок:

SELECT * FROM sys.assemblies sa WHERE sa.is_user_defined = 1; 

и вы должны увидеть и другое. Хотя если System.Data.DataSetExtensions имеет зависимые библиотеки, они не будут автоматически загружены, потому что будет загружена только папка, на которую указывает начальный CREATE ASSEMBLY, и теперь это место, где создается ваша DLL, а не .NET. Рамочная папка.

Возможно, вам будет лучше сгрузить System.Data.DataSetExtensions сам по себе в своем CREATE ASSEMBLY, указывая на соответствующую папку C: \ Windows \ Microsoft.NET \ Framework (или Framework64). Особенно если вы заметили, что в сообщении об ошибке отображается «Размер кода равен нулю», что я видел только при попытке загрузить DLL из одной из каталогов Reference Assemblies.

Теперь, поскольку это неподдерживаемая библиотека, возможно, это вещи, которые запрещают ее загрузке как SAFE. Так как у нас нет закрытого ключа данные для того, чтобы идти идеальный путь создания асимметричного ключа и затем войти на основе этого асимметричного ключа, у вас есть небольшой выбор, но:

  • установить базу данных, развертывают как Благонадежное через:

    ALTER DATABASE [DatabaseName] SET TRUSTWORTHY ON; 
    
  • загрузить сборку WITH PERMISSION_SET = UNSAFE

по существу:

USE [DatabaseName]; 

ALTER DATABASE CURRENT SET TRUSTWORTHY ON; 

CREATE ASSEMBLY [System.Data.DataSetExtensions] 
FROM 
    'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Data.DataSetExtensions.dll' 
WITH PERMISSION_SET = UNSAFE; 

После этого вы сможете загрузить свою сборку, хотя, вероятно, она также должна быть установлена ​​на UNSAFE.

И я хотел бы удалить копию System.Data.DataSetExtensions.dll, которую вы вложили в свою папку сборки.


Для получения дополнительной информации о SQLCLR в целом, пожалуйста, см серии я пишу на сервере SQL Central: Stairway to SQLCLR (требуется бесплатная регистрация).

+0

Я выполнил этот запрос, и ничего не вижу – user3610374

+0

Я обновил свой вопрос, чтобы показать изменения, которые я сделал, и я все еще получаю ту же ошибку – user3610374

+0

@ user3610374 Я только что обновил эту проблему. «Размер кода равен нулю». Я считаю, что это происходит только при попытке загрузить ссылочную сборку, а не настоящую сборку. –

 Смежные вопросы

  • Нет связанных вопросов^_^