Під час використання об'єкту виконання поширених мови SQL Server 2005, з'являється повідомлення про помилку: "Не вдалося завантажити динамічно генеруються серіалізації складання"


Помилка #: 101935 (SQLBUDT)

Причини


Якщо використовується об'єкт поширені мова виконання (CLR), Microsoft SQL Server 2005, може з'явитися повідомлення про помилку, подібне до такого:
Повідомлення з 6522, рівень 16, стан 2, рядок 1
Помилка системи .NET Framework під час виконання користувачем режим або сукупна ObjectName.
System.InvalidOperationException: Не вдалося завантажити, динамічно генеруються серіалізації складання. У деяких хостинг-середовищах складання обмежено навантаження функціональність, рекомендується використовувати засіб на заздалегідь створених серіалізації. Ознайомтеся з внутрішнього винятку, щоб отримати додаткові відомості. ---> На System.IO.FileLoadException: LoadFrom(), LoadFile(), Load(byte[]) та LoadModule() було вимкнуто хоста.
System.IO.FileLoadException:

на System.Reflection.Assembly.nLoadImage (Byte [] rawAssembly, Byte [], rawSymbolStore, дані дані, StackCrawlMark та stackMark, логічний вираз fIntrospection)
на System.Reflection.Assembly.Load (Byte [] rawAssembly, Byte [] rawSymbolStore, дані securityEvidence)
на Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters параметри, рядок [файлів)
на Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch (CompilerParameters параметри, рядок [джерела)
на Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch (CompilerParameters параметри, рядок [джерела)
на System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource (CompilerParameters параметри, рядок [-s
...
System.InvalidOperationException:
на System.Xml.Serialization.Compiler.Compile (складання батьківського рядка ns, CompilerParameters параметри, дані дані)
на System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [xmlMappings, введіть [типів, рядок defaultNamespace, дані дані, CompilerParameters параметри, складання складання, Hashtable вузлів)
на System.Xml.Serialization.TempAssembly... ctor (XmlMapping [xmlMappings, введіть [типів, рядок defaultNamespace, рядок розташування, дані дані)
на System.Xml.Serialization.XmlSerializer.GenerateTempAssembly (XmlMapping xmlMapping, введіть текст, рядок defaultNamespace)
на System.Xml.Serialization.XmlSerializer... ctor (введіть текст, рядок defaultNamespace)
на System.Xml.Serialization.XmlSe...
Наприклад, може з'явитися повідомлення про помилку під час використання CLR об'єктів, що викликає веб-служби або виконує перетворення користувача, типи XML, у SQL Server.

Причина


Ця проблема виникає, під час перетворення CLR-об'єкт тип даних XML. У разі виникнення під час цього перетворення у Windows Communication Foundation (раніше, під кодовою назвою "Індіго") намагається виконати такі дії:
  • Створити новий вузол XML-серіалізації.
  • Збережіть складання диска.
  • Завантажити складання, до поточного домену в застосунку.
Однак, SQL Server не дозволяє для такого доступу до диска в SQL CLR з міркувань безпеки. Таким чином, що з'являється повідомлення про помилку, описане в розділі "Ознаки". Кілька сценаріїв може призвести до об'єкта CLR перетворення типу даних XML.

Докладніше про основи Windows зв'язку відвідайте веб-сайті Microsoft Developer Network (MSDN):Може з'явитися повідомлення про помилку, описане в розділі "Ознаки", у таких випадках:
  • CLR код, який реалізує CLR об'єкти, явно, використовує XmlSerializer класу. Може містити CLR об'єктів, збережених процедур, функції, типи, визначені користувачем, агрегати і викликає.
  • У коді CLR використовується веб-служби.
  • Час надсилання або отримання CLR об'єктів, або із сервера SQL Server за допомогою прямого доступу до HTTP/SOAP, до SQL Server.
  • Об'єкт CLR перетворює текст, визначений користувачем тип даних XML.

Вирішення


Щоб вирішити цю проблему, скористайтеся XML засіб серіалізації генератор засіб (Sgen.exe) створення складання серіалізація XML оригінальний складання вручну. Після цього, завантажити складання до бази даних SQL Server.

Зразок коду

Наприклад, можна створити CLR функцію, яка повертає XML-дані за допомогою складання, створених у наступному прикладі:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Xml;
using System.Xml.Serialization;
using System.Text;
using System.IO;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString XMLTest()
{
Person p = new Person();
return new SqlString(p.GetXml());

}
public class Person
{
public String m_FirstName = "Jane";
public String m_LastName = "Dow";

public String GetXml()
{
XmlSerializer ser = new XmlSerializer(typeof(Person));
StringBuilder sb = new StringBuilder();
StringWriter wr = new StringWriter(sb);
ser.Serialize(wr, this);

return sb.ToString();
}

}
}
При виклику функції XMLTest у SQL Server Management Studio, слід отримати такі результати:
<?xml version="1.0" encoding="utf-16"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m_FirstName>Jane</m_FirstName>
<m_LastName>Dow</m_LastName>
</Person>
Щоб повернути правильний результат, необхідно вручну створити складання серіалізації XML для збирання вихідного. Створення серіалізації складання, вручну, скористайтеся одним із наведених нижче способів.

Примітка. Ці методи передбачають, що виконуються такі умови:
  • Ви створили базу даних dbTest екземпляра SQL Server 2005.
  • Файли проекту, зберігаються в папці C:\CLRTest.

Спосіб 1: Створення SQL Server CLR проекту, за допомогою Microsoft Visual Studio 2005

За допомогою Microsoft Visual Studio 2005 Події, складання параметр, можна створити серіалізації складання. Щоб це зробити, виконайте такі дії:
  1. Запустіть Visual Studio 2005.
  2. Створення нового проекту SQL Server, яка називається MyTest.
  3. У діалоговому вікні Додати посилання на базі даних , клацніть посилання, який підключається до бази даних dbTest і натисніть кнопку OK.

    Якщо посилання, немає у списку, необхідно створити новий посилання. Для цього натисніть кнопку " Додати нове посилання".
  4. У проекті меню натисніть кнопку " Add User-Defined функція". З'явиться діалогове вікно Додати новий елемент .
  5. Натисніть кнопку Додати , щоб додати новий файл. За промовчанням Function1.cs іменем файлу.

    Примітка. З'являється повідомлення про помилку, описане в розділі "Ознаки", якщо розгорнути проект бази даних і запустіть такі оператора Transact-SQL:
    SELECT [dbTest].[dbo].[XMLTest] ()
    Потрібно виконати дії, 6-16, щоб вирішити цю проблему.
  6. Додайте код, який зазначено в розділі "Прикладі" Function1.cs-файл.
  7. У меню проекту натисніть кнопку " MyTest властивості".
  8. У діалоговому вікні " MyTest ", натисніть на
    Події на створення варіант.
  9. У вікні після створення, подій командний рядок , введіть таку команду:
    "C:\Program Files\Microsoft з Visual Studio 8\SDK\v2.0\Bin\sgen.exe" /force "$(TargetPath)"
    Примітка. Параметр/сили , створює новий вузол серіалізації під час кожного змінення джерела складання. Крім того, ця команда потрібно змінити, якщо інстальовано Visual Studio 2005 в іншу папку.
  10. У папці C:\CLRTest, створити два текстові файли, які названі Predeployscript.sql і Postdeployscript.sql.
  11. Додайте такі команди Transact-SQL Predeployscript.sql файл:
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    DROP ASSEMBLY [MyTest.XmlSerializers]
  12. Додайте такі команди Transact-SQL Postdeployscript.sql файл:
    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
  13. У меню проекту клацніть пункт Додати наявний.
  14. У діалоговому вікні Додати наявний елемент , знайдіть папку C:\CLRTest і клацніть усі файли (*. *)у списку тип файлів .
  15. Введіть у полі ім'я файлу
    Postdeployscript.sql; Predeployscript.SQLі натисніть кнопку
    OK.
  16. У меню створити , клацніть MyTest з розгортання.
  17. У SQL Server Management Studio, виконайте наступні оператора Transact-SQL
    SELECT [dbTest].[dbo].[XMLTest] ()
    З'явиться правильні результати.

Спосіб 2., Збірки SQL CLR проект у Visual Studio командний рядок

  1. Знайдіть папку, C:\CLRTest.
  2. Створення текстового файлу, який називається MyTest.cs.
  3. Додавання коду, який зазначено в розділі "Зразок коду" MyTest.cs-файлу.
  4. Відкрити Visual Studio 2005 командний рядок.
  5. Введіть CD C:\CLRTestі натисніть клавішу ENTER.
  6. Введіть csc-/t:library MyTest.csі натисніть клавішу ENTER.
  7. Введіть sgen.exe-/force MyTest.dllі натисніть клавішу ENTER.
  8. У SQL Server Management Studio, виконайте такі команди Transact-SQL
    USE dbTest
    GO
    CREATE ASSEMBLY [MyTest] from 'C:\CLRTest\MyTest.dll'
    GO
    CREATE ASSEMBLY [MyTest.XmlSerializers.dll] from 'C:\CLRTest\MyTest.XmlSerializers.dll'
    GO

    CREATE FUNCTION XMLTest()
    RETURNS nvarchar (max)
    AS
    EXTERNAL NAME MyTest.StoredProcedures.XMLTest
    GO
  9. У SQL Server Management Studio, виконайте наступні оператора Transact-SQL
    SELECT [dbTest].[dbo].[XMLTest] ()
    З'явиться правильні результати.

Якщо використовується основних складання, який посилається на інші вузли, слід створювати XML серіалізації вузлів, для всіх вузлів, які посилаються основних складання. Після цього необхідно завантажити такі вузли XML-серіалізації до бази даних SQL Server з використанням твердження складання, створення.

Стан


Така поведінка передбачена.

Посилання


Щоб отримати додаткові відомості про XML серіалізації CLR бази даних об'єктів перейдіть на веб-сайті MSDN:Щоб отримати додаткові відомості про засіб перевірки XML засіб серіалізації генератор перейдіть на веб-сайті MSDN: