Share via


Verarbeiten des xml-Datentyps und CLR-benutzerdefinierter Datentypen

Diese Funktion wird in zukünftigen Versionen von Microsoft SQL Server nicht mehr bereitgestellt. Verwenden Sie diese Funktion beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird.

Die systemeigenen XML-Webdienste ab SQL Server 2005 erfordern für das Übergeben von Datentypen (z. B. für den xml-Datentyp oder benutzerdefinierte CLR (Common Language Runtime)-Datentypen) einige zusätzliche Entwicklungsaufgaben. Dieses Thema beschreibt die Aufgaben, die Sie ausführen müssen, damit auf XML-Webdiensten basierende Anwendungen für die Zusammenarbeit mit den xml- und CLR-benutzerdefinierten Datentypen in Webmethoden und parametrisierten Abfragen aktiviert werden.

HinweisHinweis

Es wird vorausgesetzt, dass Sie über grundlegende Kenntnisse hinsichtlich der Bereitstellung systemeigener XML-Webdienste in SQL Server verfügen. Sie müssen z. B. mit Aufgaben wie dem Erstellen von Endpunkten, Verfügbarmachen von SQL-Programmierfunktionen als Webmethoden und Schreiben grundlegender Webclientanwendungen für SQL Server vertraut sein, die andere integrierte SQL-Datentypen verwenden. Weitere Informationen hierzu finden Sie unter Systemeigene XML-Webdienste: Konzepte, Bereitstellen systemeigener XML-Webdienste und Bewährte Methoden für das Verwenden systemeigener XML-Webdienste.

Verarbeiten des xml-Datentyps in Webclientanwendungen

Die Einzelheiten für eine ordnungsgemäße Verarbeitung des xml-Datentyps durch eine Webclientanwendung hängen davon ab, welches der folgenden Szenarien vorliegt:

  • Sie arbeiten mit einer gespeicherten Prozedur, die als Webmethode für einen Endpunkt verfügbar gemacht wird.

  • Sie verwenden die SQL-Batchfunktion (sqlbatch) des Endpunkts zum Ausführen einer parametrisierten Abfrage.

Für beide Szenarien ist die Verarbeitung parametrisierter Instanzen des xml-Datentyps durch Verwenden und Auffüllen einer myEndpoint**::xml**-Struktur erforderlich. In dieser Struktur stellt myEndpoint den tatsächlichen Namen des Endpunkts dar, der verwendet wird, wenn Instanzen des xml-Datentyps durch den clientseitigen Code übergeben werden. Diese Struktur wird in der Endpunkt-Webproxyklasse deklariert.

Die myEndpoint**::xml-Struktur wird erstellt, wenn Sie den Webverweis auf den Endpunkt hinzufügen oder aktualisieren, der die Webmethode im Visual Studio-Projekt verfügbar macht. Sie müssen jedoch die anfänglich generierte myEndpoint::xml**-Struktur in der benutzerdefinierten Webproxyklasse abhängig davon, ob Sie typisiertes XML oder nicht typisiertes XML im clientseitigen Anwendungscode verwenden, entsprechend auffüllen.

Für nicht typisierte xml-Datentyp-Parameterinstanzen in Webmethoden macht die myEndpoint**::xml**-Struktur diese als Array vom Typ System.Xml.XmlNode in der Proxyklasse verfügbar. Um eine xml-Datentyp-Parameterinstanz zu übergeben, erstellen Sie daher manuell ein Array von XML-Knoten und füllen dieses auf, oder Sie verwenden vorzugsweise System.Xml.XmlDocumentFragment zu diesem Zweck. Weitere Informationen finden Sie unter Arbeiten mit dem xml-Datentyp in Visual Studio-Clientanwendungen.

Für typisiertes xml in Webmethoden wird ein benutzerdefinierter Typ in der Webproxyklasse erstellt und dem folgenden Format entsprechend benannt: Methodenname, verkettet mit dem Wort Type, gefolgt vom Namen des Parameters. Wenn die Webmethode z. B. mithilfe des Namens GetXmlInfo verfügbar gemacht wird und einen xml-Datentypparameter namens T zum Übergeben von typisiertem XML als Eingabe annimmt, lautet der Name des verfügbar gemachten benutzerdefinierten Typs in der Webproxyklasse GetXmlInfoTypeT. Dieser benutzerdefinierte Typ erbt von der myEndpoint**::xml**-Struktur, daher macht er das typisierte XML ebenfalls als Array von System.Xml.XmlNode verfügbar.

Die Verarbeitung des xml-Datentyps in parametrisierten Abfragen gleicht dem Arbeiten mit dem xml-Datentyp in Webmethoden, abgesehen von einer Ausnahme: Der typisierte XML-Code muss vom Client mit dem gleichen Typ (myEndpoint**::xml**) übergeben werden, der für nicht typisierten XML-Code verwendet wird.

Nachdem die myEndpoint**::xml**-Struktur vorbereitet wurde, kann die xml-Datentypinstanz als Array von System.Xml.XmlNode in der definierten Struktur verfügbar gemacht werden, das Array wird seinerseits in das SqlParameter.Value-Objekt eingeschlossen.

Für eine parametrisierte Abfrage sind SQL-Batchfunktionen erforderlich. Diese Anforderung kann die folgenden zusätzlichen Vorbereitungen verlangen:

  • Für den Endpunkt muss SQL aktiviert sein. Dies bedeutet, dass BATCHES=ENABLED verwendet wurde, als der Endpunkt erstellt oder geändert wurde.

  • Die sqlbatch()-Methode wird in die Webproxyklasse eingeschlossen, wenn ein Webverweis für einen batchaktivierten Endpunkt erstellt oder aktualisiert wird.

Für typisierte XML-Parameter wird die sqlbatch()-Methode in der Webproxyklasse so aktualisiert, dass sie ggf. die Einstellung weiterer Eigenschaften (XmlSchemaCollectionDatabase, XmlSchemaCollectionName, XmlSchemaCollectionOwningSchema) enthält, die sich auf die Registrierung einer XML-Schemaauflistung für das System.Data.SqlClient.SqlParameter-Objekt beziehen.

HinweisHinweis

Für Webmethoden und parametrisierte Abfragen, die den xml-Datentyp verfügbar machen und ein Dataset System.Data.DataSet in der Ausgabe (als Teil eines Arrays von Objekten) zurückgeben, dessen Inhalt in einem DataGrid-Element zum Visualisieren der Ergebnisse in der Clientanwendung gespeichert wird, verwendet DataSet keinen Webproxytyp (myEndpoint::xml), sondern den CLR-Typ System.Data.SqlTypes.SqlXml.

Verarbeiten CLR-benutzerdefinierter Typen mit Webclientanwendungen

Damit CLR-benutzerdefinierte Typen in einer Webclientanwendung verarbeitet werden können, müssen Sie die folgenden Schritte ausführen:

  1. Schreiben Sie den CLR-benutzerdefinierten Typ, und kompilieren Sie den Typ in eine DLL, z. B. in MyType.dll.

    Schreiben Sie in Visual Studio 2005 den CLR-benutzerdefinierten Typ (Klasse oder Struktur), und kompilieren Sie ihn dann in eine Assembly. Die Typassembly muss den SQL Server-Anforderungen zum Implementieren benutzerdefinierter Typen genügen. Auf diese Weise kann die Assembly für eine Instanz von SQL Server installiert und registriert werden. Weitere Informationen finden Sie im Abschnitt zu den Anforderungen zum Implementieren von UDTs in Benutzerdefinierte CLR-Typen.

  2. Wenn Sie eine Begleit-DLL für das XML-Serialisierungsprogramm generieren möchten und IXMLSerializable nicht implementiert haben, führen Sie Sgen.exe für die Typassembly-DLL aus. Der Name der DLL könnte z. B. MyType.XmlSerializers.dll lauten.

    Der CLR-benutzerdefinierte Typ muss nicht nur die Grundanforderungen von SQL Server für CLR-benutzerdefinierte Typen erfüllen, sondern auch XML-serialisierbar sein, um mit systemeigenen XML-Webdiensten in SQL Server zusammenarbeiten zu können. Weitere Informationen finden Sie im Abschnitt zur XML-Serialisierung unter Benutzerdefinierte CLR-Typen.

  3. Installieren Sie die Typassembly-DLL mithilfe von CREATE ASSEMBLY unter der Instanz von SQL Server.

    Wenn Sie IXMLSerializable nicht implementiert und Schritt 2 abgeschlossen haben, müssen Sie außerdem die Begleit-DLL für das XML-Serialisierungsprogramm mithilfe von CREATE ASSEMBLY unter der Instanz von SQL Server installieren.

  4. Serialisieren Sie den CLR-benutzerdefinierten Typ in XML, und schließen Sie ihn in eine myEndpoint**::xml**-Struktur ein, die der im vorherigen Abschnitt beschriebenen ähnlich ist.

    Nachdem der CLR-benutzerdefinierte Typ auf dem Server installiert wurde, müssen Sie den CLR-benutzerdefinierten Typ zuerst in das XML-Format serialisieren und dann in eine XML-Struktur einschließen, um eine Instanz dieses CLR-benutzerdefinierten Typs aus einer systemeigenen XML-Webdienste-Clientanwendung an SQL Server zu übergeben.

    Der folgende Code zeigt das Serialisieren eines CLR-benutzerdefinierten Typs in das XML-Format und das anschließende Platzieren in einem XML-Element (System.Xml.XmlElement).

    // Create the user-defined type class on the client.
    SqlString s = new SqlString("0:0");
    UdtClientApp.Point pnt = Point.Parse(s);
    // Invoke the method and pass in a user-defined type.You will need
    // to convert this to XmlElement before you can pass it to SQL Server.
    System.IO.MemoryStream writer = new System.IO.MemoryStream();
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(UdtClientApp.Point));
    serializer.Serialize(writer, pnt);
    writer.Seek(0, System.IO.SeekOrigin.Begin);
    System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
    xmlDoc.Load(writer);
    System.Xml.XmlElement udtXml = xmlDoc.DocumentElement;
    
  5. Abhängig davon, ob der CLR-benutzerdefinierte Typ auf dem Client vorhanden ist, müssen Sie möglicherweise einen Ausgabeparameter aus seinem XML-Format des CLR-benutzerdefinierten Typs zurück in sein Format des benutzerdefinierten Typs deserialisieren.

    Der folgende Code zeigt das Deserialisieren des XML-Formats eines CLR-benutzerdefinierten Typs zurück in den CLR-benutzerdefinierten Typ im clientseitigen Code. In diesem Beispiel ist der CLR-benutzerdefinierte Typ Point.

    Object[] results = proxy.GetPointUdt(Convert.ToInt16(textBox1.Text), ref udtXml);
    //Deserialze the XML into user-defined type.
    TextReader reader = new StringReader(udtXml.OuterXml);
    // pnt was already defined as UdtClientApp.Point pnt = Point.Parse(s);
    pnt = (UdtClientApp.Point) serializer.Deserialize(reader);
    

    Beachten Sie, dass dieser Deserialisierungsvorgang nicht ausgeführt werden muss, wenn Sie den CLR-benutzerdefinierten Typ als nicht typisiertes XML auf dem Client verwenden.

CLR-benutzerdefinierte Typen können auch auf die gleiche Weise als Parameter an eine parametrisierte Abfrage übergeben werden, wie im Abschnitt zum xml-Datentyp beschrieben wird. Der CLR-benutzerdefinierte Typ in seiner XML-serialisierten Form muss vom Client übergeben werden, indem der myEndpoint**::xml**-Typ verwendet wird.

Bei einer parametrisierten Abfrage, die CLR-benutzerdefinierte Typen umfasst, werden andere Werte für die System.Data.SqlClient.SqlParameter-Struktur festgelegt. Die folgenden Eigenschafteneinstellungen werden z. B. für CLR-benutzerdefinierte Typen verwendet:

  • Die SqlDbType-Eigenschaft muss auf einen Wert von Udt festgelegt werden.

  • Die ClrTypeName-Eigenschaft muss auf den dreiteiligen qualifizierten SQL Server-Namen (MyDatabase**.MySchema.**MyUdtType) des installierten benutzerdefinierten Typs festgelegt werden, der für die Instanz von SQL Server registriert wurde.