DetailPage-MSS-KB

Knowledge Base

Artikel-ID: 913668 - Geändert am: Mittwoch, 23. Mai 2007 - Version: 2.1

 
# Fehler: 101935 (SQLBUDT)

Auf dieser Seite

Problembeschreibung

Wenn Sie ein Objekt der common Language Runtime (CLR) in Microsoft SQL Server 2005 verwenden, erhalten Sie eine Fehlermeldung, die der folgenden ähnelt:
Msg 6522, Ebene 16, Status 2, 1
Eine .NET Framework-Fehler während der Ausführung der benutzerdefinierten Routine oder Aggregatfunktionen 'Objektname':
System.InvalidOperationException: Kann nicht dynamisch generierte Serialisierungsassembly geladen werden. In einigen hosting-Umgebungen Assembly laden-Funktionalität ist eingeschränkt, vorgenerierte Serialisierungsprogramm in Erwägung ziehen. Finden Sie weitere inneren Ausnahme. ---> System.IO.FileLoadException: LoadFrom, LoadFile(), Load(Byte[]) und LoadModule() wurden durch die Host deaktiviert.
System.IO.FileLoadException:
am System.Reflection.Assembly.nLoadImage (Byte [] RawAssembly, Byte []-RawSymbolStore, Beweise Beweise, StackCrawlMark & StackMark, fIntrospection Boolean)
am System.Reflection.Assembly.Load (Byte [] RawAssembly, Byte [] RawSymbolStore, Beweise SecurityEvidence)
am Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters Optionen, String [] Dateinamen)
am Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
am Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources)
am System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] s
...
System.InvalidOperationException:
am System.Xml.Serialization.Compiler.Compile (übergeordnete Assembly, String ns, CompilerParameters Parameter, Beweise Beweise)
am System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [] XmlMappings, Type [] Types, String-DefaultNamespace, Beweise Beweise, CompilerParameters Parameter, Assembly Assembly, Hashtable Assemblys)
am System.Xml.Serialization.TempAssemblyCtor (XmlMapping [] XmlMappings, Type [] Types, String DefaultNamespace, String-Speicherort, Beweise Beweise)
am System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
am System.Xml.Serialization.XmlSerializerctor(Type Type, String defaultNamespace)
am System.Xml.Serialization.XmlSe...
Beispielsweise erhalten Sie die Fehlermeldung, wenn Sie ein CLR-Objekt verwenden, die einen Webdienst aufruft oder Konvertierung von benutzerdefinierten Typen in XML in SQL Server.

Ursache

Dieses Problem tritt auf, wenn ein CLR-Objekt auf XML-Daten konvertiert wird Datentyp. Wenn diese Konvertierung auftritt, Windows Communication Foundation (früherer Codename „ Indigo „) versucht, die folgenden Schritte ausführen:
  • Generieren Sie eine neue XML-Serialisierungsassembly.
  • Speichern Sie die Assembly auf Datenträger.
  • Laden Sie die Assembly in die aktuelle Anwendungsdomäne.
Allerdings lässt SQL Server für diese Art des Festplattenzugriffs in der SQL-CLR aus Sicherheitsgründen nicht zu. Daher erhalten Sie die Fehlermeldung, das im Abschnitt "Problembeschreibung" genannt wird. Mehrere Szenarien möglicherweise die CLR-Objekt in der XML-Datentyp konvertiert werden.

Weitere Informationen über Windows Communication Foundation der folgenden Microsoft Developer Network (MSDN)-Website:
http://msdn2.microsoft.com/en-us/library/ms735119.aspx (http://msdn2.microsoft.com/en-us/library/ms735119.aspx)
Möglicherweise wird die Fehlermeldung angezeigt, die im Abschnitt "Problembeschreibung" in den folgenden Szenarien genannt wird:
  • Der CLR-Code, der CLR-Objekte explizit implementiert, verwendet die XmlSerializer -Klasse. Diese CLR-Objekte können gespeicherte Prozeduren, Funktionen, benutzerdefinierte Typen, Aggregate und Trigger umfassen.
  • Verwenden Sie einen Webdienst in der CLR-Code.
  • Sie senden oder empfangen CLR-Objekte zu oder von SQL Server mithilfe von HTTP-SOAP-Direktzugriff auf SQL Server.
  • Das CLR-Objekt wird ein benutzerdefinierten Typ in der XML-Datentyp konvertiert.

Lösung

Um dieses Problem zu beheben, müssen Sie das XML Serializer Generator Tool (Sgen.exe) verwenden, um die XML-Serialisierungs-Assembly erstellen für die ursprüngliche Assembly manuell. Danach Laden Sie die Assemblys in einer SQL Server-Datenbank.

Codebeispiel

For example, you may want to create a CLR function that returns XML data by using an assembly that is created by the following code example:
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();
        }

    }
}
When you call the XMLTest function in SQL Server Management Studio, you expect to receive the following result:
<?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>
um das richtige Ergebnis zurückzugeben, erstellen Sie manuell die XML-Serialisierungsassembly für die ursprüngliche Assembly. Verwenden Sie eine der folgenden Methoden, um die Serialisierungs-Assembly manuell erstellen.

Hinweis: Diese Methoden Annahme, dass die folgenden Bedingungen true sind:
  • Sie haben eine DbTest -Datenbank in einer Instanz von SQL Server 2005 erstellt.
  • Alle Projektdateien werden in der C:\CLRTest gespeichert Ordner.

Methode 1: Erstellen einer SQL Server CLR-Projekt mit Microsoft Visual Studio 2005

Sie können die Serialisierungsassembly mithilfe der Build Events -Option in Microsoft Visual Studio 2005 erstellen. Gehen Sie hierzu folgendermaßen vor:
  1. Starten Sie Visual Studio 2005.
  2. Erstellen Sie ein neues SQL Server-Projekt mit dem Namen MyTest.
  3. Klicken Sie im Dialogfeld Datenbankverweis hinzufügen klicken Sie auf den Verweis, der mit der DbTest -Datenbank verbunden, und klicken Sie dann auf OK .

    Wenn der Verweis nicht in der Liste enthalten ist, müssen Sie einen neuen Verweis erstellen. Klicken Sie dazu auf Neuen Verweis hinzufügen .
  4. Klicken Sie im Menü Projekt auf Hinzufügen benutzerdefinierten Funktion . Das Dialogfeld Neues Element hinzufügen wird angezeigt.
  5. Klicken Sie auf Hinzufügen , um eine neue Datei hinzuzufügen. Standardmäßig wird die Datei Function1.cs benannt.

    Hinweis: Sie erhalten die Fehlermeldung, die im "Problembeschreibung" erwähnt wird im Abschnitt, wenn Sie das Projekt in der Datenbank bereitstellen, und führen Sie die folgende Transact-SQL-Anweisung:
    SELECT [dbTest].[dbo].[XMLTest] ()
    müssen Sie Schritte 6-16, um dieses Problem zu beheben.
  6. Fügen Sie den Code, der in den Abschnitt "Code Example" die Datei Function1.cs aufgeführt ist.
  7. Klicken Sie im Menü Projekt auf MyTest Eigenschaften .
  8. Klicken Sie im Dialogfeld MyTest auf Build Events -Option.
  9. Geben Sie den folgenden Befehl im Feld Befehlszeile für Postbuildereignis :
    "C:\Programme\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe"Force"$(TargetPath)""
    Hinweis: Die Option/force generiert eine neue Serialisierungsassembly jedes Mal, dass Sie die Quellassembly ändern. Darüber hinaus müssen Sie diesen Befehl ändern, wenn Sie Visual Studio 2005 in einem anderen Ordner installiert.
  10. Erstellen Sie im Ordner C:\CLRTest zwei Textdateien mit den Namen Predeployscript.sql und Postdeployscript.sql.
  11. Fügen Sie folgenden Transact-SQL-Anweisungen ein Predeployscript.sql-Datei:
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    	DROP ASSEMBLY [MyTest.XmlSerializers]
    
  12. Fügen Sie folgenden Transact-SQL-Anweisungen ein Postdeployscript.sql-Datei:
    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
    
  13. Klicken Sie im Projekt auf Hinzufügen, vorhandene Element .
  14. Klicken Sie im Dialogfeld Vorhandenes Element hinzufügen suchen Sie den C:\CLRTest-Ordner, und klicken Sie dann auf Alle Dateien (*. *) in der Liste Typ .
  15. Geben Sie in das Feld Dateiname Postdeployscript.sql;Predeployscript.sql und klicken Sie dann auf OK .
  16. Klicken Sie im Menü Erstellen auf Bereitstellen MyTest .
  17. Führen Sie die folgende Transact-SQL-Anweisung in SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    erhalten Sie das richtige Ergebnis.

Methode 2: Erstellen Sie ein SQL CLR-Projekt im Fenster Visual Studio-Eingabeaufforderung

  1. Suchen Sie den Ordner C:\CLRTest.
  2. Erstellen Sie eine Textdatei mit dem Namen MyTest.cs.
  3. Fügen Sie den Code, der in den Abschnitt "Code Example" die Datei MyTest.cs aufgeführt ist.
  4. Öffnen Sie das Fenster Visual Studio 2005-Eingabeaufforderung.
  5. Geben Sie CD C:\CLRTest , und drücken Sie anschließend die [EINGABETASTE].
  6. Geben Sie csc /t:library MyTest.cs , und drücken Sie anschließend die [EINGABETASTE].
  7. Geben Sie sgen.exe force MyTest.dll , und drücken Sie anschließend die [EINGABETASTE].
  8. Führen Sie die folgenden Transact-SQL-Anweisungen in 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. Führen Sie die folgende Transact-SQL-Anweisung in SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    erhalten Sie das richtige Ergebnis.

Wenn Sie eine Hauptassembly, die auf andere Assemblys verweist verwenden, müssen Sie XML-Serialisierungsassemblys für alle Assemblys generieren, die von der Hauptassembly verwiesen wird. Anschließend müssen Sie diese XML-Serialisierungsassemblys in der SQL Server-Datenbank mithilfe der Anweisung CREATE ASSEMBLY laden.

Status

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Informationsquellen

Weitere Informationen zu XML-Serialisierung von CLR-Datenbankobjekte, besuchen Sie den folgenden MSDN-Website:
http://msdn2.microsoft.com/en-us/library/ms131088.aspx (http://msdn2.microsoft.com/en-us/library/ms131088.aspx)
Weitere Informationen über das XML Serializer Generator-Tool die folgenden MSDN-Website:
http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx (http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx)

Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Workgroup Edition
Keywords: 
kbmt kbsql2005clr kbexpertiseadvanced kbprb KB913668 KbMtde
Maschinell übersetzter ArtikelMaschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 913668  (http://support.microsoft.com/kb/913668/en-us/ )
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Freigeben
Weitere Supportoptionen
Microsoft Community-Supportforen
Kontaktieren Sie uns direkt
Zertifizierten Partner finden
Microsoft Store