Bug #: 101935 (SQLBUDT)
BUG #: 101935 (SQL BU chyby sledovanie)BUG #: 50180 (údržby)

Príznaky

Keď použijete objekt spoločný jazyk runtime (CLR) Microsoft SQL Server 2005, zobrazí sa chybové hlásenie podobné nasledovnému:

MSG 6522, úroveň 16, stav 2, riadok 1
.NET Framework vyskytla počas vykonania definované používateľom bežné alebo súhrnnej "ObjectName":
System.InvalidOperationException: Dynamicky generované serializácia zostavy sa nedá načítať. V niektorých hostiteľských prostrediach načítať funkcie obmedzené, zvážte použitie predgenerovaných serializer. Prečítajte si vnútorných výnimiek ďalšie informácie. ---> System.IO.FileLoadException: LoadFrom(), LoadFile(), Load(byte[]) a LoadModule() vypnúť hostiteľa.
System.IO.FileLoadException:

v System.Reflection.Assembly.nLoadImage (Byte [] rawAssembly, Byte [] rawSymbolStore, dôkaz dôkaz StackCrawlMark a stackMark, Boolean fIntrospection)
v System.Reflection.Assembly.Load (Byte [] rawAssembly, Byte [] rawSymbolStore, dôkaz securityEvidence)
v Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters možnosti, reťazec [súborov)
v Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch (CompilerParameters možnosti, zdroje String [])
v Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch (CompilerParameters možnosti, zdroje String [])
v System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource (CompilerParameters možnosti, s String]
...
System.InvalidOperationException:
v System.Xml.Serialization.Compiler.Compile (zhromaždenie nadradený reťazec ns CompilerParameters parametre, dôkaz dôkaz)
v System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [xmlMappings Type [typy reťazcov defaultNamespace, dôkaz dôkaz, CompilerParameters parametre, montáž zostavy, Hashtable zostavy)
v System.Xml.Serialization.TempAssembly... ctor (XmlMapping [xmlMappings Type [typy reťazec defaultNamespace, reťazec umiestnenia, dôkaz dôkaz)
v System.Xml.Serialization.XmlSerializer.GenerateTempAssembly (XmlMapping xmlMapping typ, reťazec defaultNamespace)
v System.Xml.Serialization.XmlSerializer... ctor (typ, reťazec defaultNamespace)
v System.Xml.Serialization.XmlSe...

Napríklad môže zobraziť chybové hlásenie pri použití CLR objekt, ktorý vyžaduje webovej služby alebo vykoná konverzia z používateľom definované typy XML v SQL Server.

Príčina

Tento problém sa vyskytuje, keď CLR objektov sa skonvertuje na typ údajov XML. Pri výskyte tejto konverzii Windows Communication Foundation (pôvodne kódový názov "Indigo") sa pokúsi vykonať nasledovné kroky:

  • Vytvárať nové montáž XML serializácie.

  • Zostava uložiť na disk.

  • Načítanie zostavy do aktuálnej doméne aplikácie.

SQL Server sa však neumožňuje takúto disketu prístup v SQL CLR z bezpečnostných dôvodov. Preto sa zobrazí chybové hlásenie, ktoré je spomenuté v časti "Príznaky". Niekoľko scenárov môže spôsobiť CLR objektu skonvertovať na typ údajov XML.

Ďalšie informácie o Windows Communication Foundation, nájdete na nasledujúcej webovej lokalite Microsoft Developer Network (MSDN):

http://msdn2.microsoft.com/en-us/library/ms735119.aspxMôže sa zobraziť chybové hlásenie, ktoré je spomenuté v časti "Príznaky" v nasledujúcich situáciách:

  • CLR kód, ktorý implementuje CLR objektov explicitne používa XmlSerializer trieda. Tieto CLR objektov patria uložené procedúry, funkcie používateľom definované typy, zariadenia určené a spúšťa.

  • Používate webovej služby v kóde CLR.

  • Odosielaní alebo prijímaní CLR objektov z SQL Server alebo pomocou priameho prístupu HTTP/SOAP SQL Server.

  • Objekt CLR používateľom definovaný typ konvertuje typ údajov XML.

Riešenie

Na vyriešenie tohto problému, musíte použiť XML Serializer generátor nástroj (Sgen.exe) vytvorenie XML serializácie zhromaždenie pôvodnej zhromaždenie manuálne. Vložte zostavy do databázy servera SQL Server.

Napríklad kód

Napríklad môžete vytvoriť CLR funkcia, ktorá vráti údaje XML pomocou zostavy vytvorené nasledovné kód:

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();
}

}
}

Keď použijete funkciu XMLTest SQL Server Management Studio, očakávate, že nasledujúcich výsledkov:

<?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>

Vrátiť správny výsledok, je nutné nastaviť manuálne XML serializácie zhromaždenia pôvodnej zostavy. Použite jeden z nasledujúcich postupov na manuálne vytvorenie serializácia zostavy.

Poznámka: Tieto postupy Predpokladajme, že sú splnené nasledujúce podmienky:

  • Vytvorení odstránená databázy inštanciu programu SQL Server 2005.

  • Všetky súbory projektu sú uložené v priečinku C:\CLRTest.

Metóda 1: Vytvoriť SQL Server CLR projekt pomocou Microsoft Visual Studio 2005

Serializácia zostavy môžete vytvoriť pomocou možnosť Vytvoriť udalosti v Microsoft Visual Studio 2005. Ak to chcete urobiť, postupujte nasledovne:

  1. Spustite program Visual Studio 2005.

  2. Vytvorenie nového projektu SQL Server s názvom MyTest.

  3. V dialógovom okne Pridať odkaz na databázu , kliknite na odkaz, ktorý sa pripojí k databáze odstránená , a kliknite na tlačidlo OK.

    Ak odkaz nie je v zozname, je nutné vytvoriť nový odkaz. Chcete urobiť, kliknite na tlačidlo Pridať nový odkaz.

  4. Projekt v ponuke Add User-Defined funkcie. Pridať novú položku dialógové okno.

  5. Kliknite na tlačidlo Pridať pridať nový súbor. Na základe predvoleného nastavenia súbor sa nazýva Function1.cs.

    Poznámka: Chybové hlásenie uvedené v časti "Príznaky" Ak nasadenie projektu databázy a spustite nasledujúci príkaz Transact-SQL:

    SELECT [dbTest].[dbo].[XMLTest] ()

    Vykonajte kroky 6-16 tohto problému.

  6. Pridať kód, ktorý je uvedený v časti "Napríklad kód" Function1.cs súbor.

  7. V ponuke projekt kliknite na položku Vlastnosti MyTest.

  8. V dialógovom okne MyTest kliknite
    Možnosť Vytvoriť udalosti .

  9. V poli po vytvoriť udalosť príkazového riadka zadajte nasledujúci príkaz:

    "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" / Force "$(TargetPath)"Poznámka: Možnosť/force generuje nové zhromaždenie serializácia pri každom úpravu zdroja zostavy. Okrem toho musíte zmeniť tento príkaz po nainštalovaní Visual Studio 2005 v inom priečinku.

  10. V priečinku C:\CLRTest vytvoriť dva textové súbory Predeployscript.sql a Postdeployscript.sql.

  11. Pridajte nasledujúce vyhlásenie Transact-SQL Predeployscript.sql súboru:

    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') DROP ASSEMBLY [MyTest.XmlSerializers]

  12. Pridajte nasledujúce vyhlásenie Transact-SQL Postdeployscript.sql súboru:

    CREATE ASSEMBLY [MyTest.XmlSerializers] from'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE

  13. Projekt v ponuke Pridať existujúcu položku.

  14. V dialógovom okne Pridať existujúcu položku vyhľadajte priečinok C:\CLRTest a potom kliknite na všetky súbory (*. *)v zozname súbory typu .

  15. Do poľa názov súboru zadajte
    Postdeployscript.sql; Predeployscript.SQL, a potom kliknite na tlačidlo
    OK.

  16. Zostava ponuke Nasadiť MyTest.

  17. Spustite nasledujúci príkaz Transact-SQL SQL Server Management Studio:

    SELECT [dbTest].[dbo].[XMLTest] ()

    Zobrazí sa správny výsledok.

Metóda 2: Vytvoriť projekt Visual Studio príkazový riadok SQL CLR

  1. Vyhľadajte priečinok C:\CLRTest.

  2. Vytvorte textový súbor s názvom MyTest.cs.

  3. Pridať kód, ktorý je uvedený v časti "Napríklad kód" MyTest.cs súbor.

  4. Otvorte okno Visual Studio 2005 príkazového riadka.

  5. Typ CD C:\CLRTesta stlačte kláves ENTER.

  6. Zadajte csc /t:library MyTest.csa stlačte kláves ENTER.

  7. Zadajte sgen.exe/Force MyTest.dlla stlačte kláves ENTER.

  8. Spustite nasledujúce Transact-SQL vyhlásenie v SQL Server Management Studio:

    USE dbTestGO
    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. Spustite nasledujúci príkaz Transact-SQL SQL Server Management Studio:

    SELECT [dbTest].[dbo].[XMLTest] ()

    Zobrazí sa správny výsledok.


Používate hlavné zostava, ktorá odkazuje na iných, je potrebné vygenerovať XML serializácie zostavy pre všetky zostavy, ktoré sa uvádzajú hlavné zhromaždenie. Potom je potrebné načítať tieto XML serializácie zostavy do databázy servera SQL Server pomocou príkazu vytvoriť zostavy.

Stav

Toto správanie je zámerné.

Odkazy

Ďalšie informácie o XML serializácie z CLR objektov, nájdete na nasledujúcej webovej lokalite MSDN:

http://msdn2.microsoft.com/en-us/library/ms131088.aspxĎalšie informácie o nástroji XML Serializer generátor, nájdete na nasledujúcej webovej lokalite MSDN:

http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx

Potrebujete ďalšiu pomoc?

Rozšírte svoje zručnosti
Preskúmať školenie
Buďte medzi prvými, ktorí získajú nové funkcie
Pripojiť k Microsoft insiderov chcú

Boli tieto informácie užitočné?

Aká je podľa vás jazyková kvalita textu?
Čo sa vám páčilo, prípadne čo nie?

Ďakujeme za vaše pripomienky!

×