Verarbeiten des xml-Datentyps und CLR-benutzerdefinierter Datentypen

Für die systemeigenen XML-Webdienste in SQL Server 2005 sind für das Übergeben neuer Datentypen (z. B. für den xml-Datentyp oder CLR-benutzerdefinierte (Common Language Runtime) Datentypen) einige zusätzliche Entwicklungsaufgaben erforderlich. 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.

ms175119.note(de-de,SQL.90).gifHinweis:
Es wird vorausgesetzt, dass Sie über grundlegende Kenntnisse hinsichtlich der Bereitstellung systemeigener XML-Webdienste in SQL Server 2005 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 Verwenden der systemeigenen XML-Webdienste in SQL Server 2005, 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 Endpunktes 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 Endpunktes 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 mithilfe des folgenden Formats 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 ähnelt mit einer Ausnahme dem Arbeiten mit dem xml-Datentyp in Webmethoden: Das typisierte XML muss vom Client mithilfe des gleichen Typs (myEndpoint**::xml**) übergeben werden, der mit nicht typisiertem XML 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.

ms175119.note(de-de,SQL.90).gifHinweis:
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 2005-Anforderungen zum Implementieren benutzerdefinierter Typen genügen. Auf diese Weise kann die Assembly für eine Instanz von SQL Server 2005 installiert und registriert werden. Weitere Informationen finden Sie im Abschnitt zu den Anforderungen zum Implementieren von UDTs in CLR User-Defined Types.

  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 2005 für CLR-benutzerdefinierte Typen erfüllen, sondern auch XML-serialisierbar sein, um mit systemeigenen XML-Webdiensten in SQL Server 2005 zusammenarbeiten zu können. Weitere Informationen finden Sie im Abschnitt zur XML-Serialisierung unter CLR User-Defined Types.

  3. Installieren Sie die Typassembly-DLL mithilfe von CREATE ASSEMBLY unter der Instanz von SQL Server 2005.
    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 2005 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 zum Übergeben einer Instanz dieses CLR-benutzerdefinierten Typs aus einer systemeigenen XML-Webdienste-Clientanwendung an SQL Server 2005 den CLR-benutzerdefinierten Typ zuerst in das XML-Format serialisieren und dann in eine XML-Struktur einschließen.
    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 2005 registriert wurde.

Siehe auch

Konzepte

Bewährte Methoden für das Verwenden systemeigener XML-Webdienste
Bereitstellen systemeigener XML-Webdienste

Andere Ressourcen

Verwenden der systemeigenen XML-Webdienste in SQL Server 2005
CLR User-Defined Types

Hilfe und Informationen

Informationsquellen für SQL Server 2005