Съобщение за грешка, когато използвате общ език runtime обект в SQL Server 2005: "Не се зарежда динамично генерирани сериализиране събрание"


Грешка #: 101935 (SQLBUDT)

Симптоми


Когато използвате общ language runtime (CLR) обект в Microsoft SQL Server 2005, можете да получите съобщение за грешка, подобно на следното:
Състояние на MSG 6522, ниво 16, 2, ред 1
.NET Framework грешка по време на изпълнение на дефинирани от потребителя рутинни или общия "обект":
System.InvalidOperationException: Не може да се зарежда динамично генерирани сериализиране събрание. В някои хостинг среди събрание е ограничено натоварване функционалност, можете да използвате предварително генерирани програма за сериализация. Вижте вътрешното изключение за повече информация. ---> System.IO.FileLoadException: LoadFrom(), LoadFile(), Load(byte[]) и LoadModule() са забранени от хост.
System.IO.FileLoadException:

в System.Reflection.Assembly.nLoadImage (rawAssembly Byte [], Byte [] rawSymbolStore, доказателство, доказателство, StackCrawlMark и stackMark, Boolean fIntrospection)
в System.Reflection.Assembly.Load (rawAssembly Byte [], 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 опции, [низове
...
System.InvalidOperationException:
в System.Xml.Serialization.Compiler.Compile (родителски блок, низ ns, CompilerParameters параметри, доказателство доказателство)
в System.Xml.Serialization.TempAssembly.GenerateAssembly (използване [xmlMappings, тип [типове, defaultNamespace низ, доказателство доказателство, CompilerParameters параметри, събрание събрание, Hashtable блокове)
в System.Xml.Serialization.TempAssembly... "заплаха" означавапотенциалнапричина (използване [xmlMappings, тип [типове, defaultNamespace низ, низа местоположение, доказателство доказателство)
в System.Xml.Serialization.XmlSerializer.GenerateTempAssembly (използване използване, тип низ defaultNamespace)
в System.Xml.Serialization.XmlSerializer... "заплаха" означавапотенциалнапричина (тип, низ defaultNamespace)
в System.Xml.Serialization.XmlSe...
Например може да получите съобщение за грешка, когато използвате CLR обект, който изисква уеб услуга или извършва конвертиране от потребителски типове на XML в SQL Server.

Причина


Този проблем възниква, когато обект на CLR се преобразува в типа на XML данни. При възникване на преобразуването Windows комуникация фондация (по-рано кодово име "Индиго") се опитва да направите следното:
  • Генерира нов 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 сериализиране събрание първоначалния монтаж. Използвайте един от следните методи, за да създадете събрание сериализиране ръчно.

Забележка: Тези методи да предположим, че са налице следните условия:
  • Създавате база данни поправите в екземпляр на 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. В диалоговия прозорец Добавяне на препратка за база данни щракнете върху препратката, която се свързва с поправите базата данни и щракнете върху 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. Изпълнете следната команда на Transact-SQL в SQL Server Management Studio:
    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. Изпълнете следните команди Transact-SQL в SQL Server Management Studio:
    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. Изпълнете следната команда на Transact-SQL в SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    Получавате правилни резултати.

Ако използвате основния блок препраща към други устройства, трябва да генерира XML сериализиране възли за всички възли, които са посочени от основните събрание. След това трябва да се зареди тези XML сериализиране възли в базата данни на SQL Server с помощта на отчета за създаване на събрание.

Статус


Това поведение е умишлено.

Препратки


За повече информация за XML сериализиране от CLR обекти посетете следния сайт на MSDN:За повече информация относно програмата за сериализация генератор XML инструмент посетете следния сайт на MSDN: