Gestion du type de données XML et des types CLR définis par l'utilisateur
Cette fonctionnalité sera supprimée dans une prochaine version de Microsoft SQL Server. Évitez d'utiliser cette fonctionnalité dans de nouveaux travaux de développement et prévoyez de modifier les applications qui utilisent actuellement cette fonctionnalité.
Dans les services Web XML natifs à compter de SQL Server 2005, la transmission de types tels que le type de données xml ou les types CLR (Common Language Runtime) définis par l'utilisateur requiert certaines tâches de développement supplémentaires. Cette rubrique décrit les tâches que vous devez effectuer pour permettre aux applications basées sur les services Web XML de fonctionner avec les types de données xml et CLR défini par l'utilisateur dans des méthodes Web et des requêtes paramétrées.
[!REMARQUE]
Il est supposé que vous possédez des connaissances de base sur le déploiement des services Web XML natifs dans SQL Server. Cela implique que des tâches telles que la création de points de terminaison, l'exposition de la programmabilité SQL sous forme de méthodes Web et l'écriture d'applications clientes Web de base pour SQL Server qui utilisent d'autres types SQL intégrés vous sont familières. Si vous souhaitez revoir ces informations, consultez Concepts des services Web XML natifs, Déploiement de services Web XML natifs et Méthodes préconisées pour l'utilisation des services Web XML natifs.
Gestion du type de données XML dans des applications clientes Web
Pour qu'une application cliente Web gère correctement le type de données xml, certains détails dépendent du scénario qui s'applique parmi les suivants :
Vous travaillez avec une procédure stockée exposée en tant que méthode Web à un point de terminaison.
Vous utilisez la fonctionnalité de traitement SQL (sqlbatch) du point de terminaison pour exécuter une requête paramétrée.
Ces deux scénarios requièrent des instances paramétrées du type de données xml pour être gérés en utilisant et en remplissant une structure myEndpoint**::xml**. Dans cette structure, myEndpoint représente le nom réel du point de terminaison utilisé lorsque des instances du type de données xml sont transmises via le code côté client. Cette structure est déclarée dans la classe proxy Web de point de terminaison.
La structure myEndpoint**::xml** est créée lorsque vous ajoutez ou mettez à jour la référence Web au point de terminaison qui expose la méthode Web dans le projet Visual Studio. Toutefois, vous devez remplir la structure initiale myEndpoint**::xml** générée dans la classe proxy Web personnalisée en conséquence, selon que vous utilisez des données XML typées ou des données XML non typées dans le code de l'application côté client.
Pour les instances de paramètre de type de données xml non typées dans les méthodes Web, la structure myEndpoint**::xml** les expose sous forme de tableau de type System.Xml.XmlNode dans la classe proxy. Par conséquent, pour transmettre une instance de paramètre de type de données xml, vous devez construire et remplir manuellement un tableau de nœuds XML ou utiliser de préférence System.Xml.XmlDocumentFragment pour cela. Pour plus d'informations, consultez Utilisation du type de données xml dans les applications clientes Visual Studio.
Pour des données xml typées dans des méthodes Web, un type personnalisé est généré dans la classe proxy Web et nommé en fonction du format suivant : le nom de la méthode concaténé avec le mot Type, puis suivi du nom du paramètre. Par exemple, si la méthode Web est exposée à l'aide du nom GetXmlInfo et accepte un paramètre de type xml nommé T pour transmettre des données XML typées en entrée, le nom du type personnalisé exposé dans la classe proxy Web est GetXmlInfoTypeT. Ce type personnalisé hérite de la structure myEndpoint**::xml** et expose donc de la même manière les données XML typées sous forme de tableau de System.Xml.XmlNode.
La gestion du type de données xml dans les requêtes paramétrées est similaire à l'utilisation du type de données xml dans les méthodes Web, à une exception près : les données XML typées doivent être transmises à partir du client à l'aide du même type (myEndpoint**::xml**) qui est utilisé avec des données XML non typées.
Une fois que la structure myEndpoint**::xml** a été préparée, l'instance de type de données xml peut être exposée sous forme de tableau de System.Xml.XmlNode au sein de la structure définie, laquelle est à son tour incluse dans l'objet SqlParameter.Value.
Une requête paramétrée requiert la fonctionnalité de traitement SQL. Cela peut inclure les préparations supplémentaires suivantes :
Le point de terminaison doit prendre en charge SQL. Cela signifie que BATCHES=ENABLED a été utilisé lorsque le point de terminaison a été créé ou modifié.
Dans la classe proxy Web, la méthode sqlbatch() sera incluse lors de l'ajout ou de la mise à jour d'une référence Web pour un point de terminaison prenant en charge les traitements.
Pour les paramètres XML typés, la méthode sqlbatch() dans la classe proxy Web est mise à jour pour inclure le paramétrage de toutes les propriétés supplémentaires (XmlSchemaCollectionDatabase, XmlSchemaCollectionName, XmlSchemaCollectionOwningSchema) liées à l'inscription d'une collection de schémas XML pour l'objet System.Data.SqlClient.SqlParameter.
[!REMARQUE]
Pour les méthodes Web et les requêtes paramétrées qui exposent le type de données xml, où un System.Data.DataSet est retourné en sortie (dans le cadre d'un tableau d'objets) et son contenu est placé dans un DataGrid pour afficher les résultats dans l'application cliente, le DataSet n'utilise pas le type de proxy Web (myEndpoint::xml), mais utilise le type CLR System.Data.SqlTypes.SqlXml à la place.
Gestion des types CLR définis par l'utilisateur avec des applications clientes Web
Pour gérer les types CLR définis par l'utilisateur dans une application cliente Web, vous devez procéder comme suit :
Écrivez le type CLR défini par l'utilisateur et compilez-le dans une DLL, telle que MyType.dll.
Dans Visual Studio 2005, écrivez le type CLR défini par l'utilisateur (classe ou struct) et compilez-le dans un assembly. L'assembly de type doit être conforme aux conditions relatives à SQL Server pour l'implémentation de types définis par l'utilisateur. Cela permet d'installer et d'inscrire l'assembly dans une instance de SQL Server. Pour plus d'informations, consultez « Conditions d'implémentation des UDT » dans Types CLR définis par l'utilisateur.
Pour générer une DLL d'assistant de sérialiseur XML, si vous n'avez pas implémenté IXMLSerializable, exécutez Sgen.exe sur la DLL d'assembly de type. Elle aura un nom tel que MyType.XmlSerializers.dll.
En plus de se conformer aux conditions de base pour le type CLR défini par l'utilisateur pour utiliser SQL Server, le type CLR défini par l'utilisateur doit également permettre la sérialisation XML pour fonctionner avec les services Web XML natifs dans SQL Server. Pour plus d'informations, consultez « Sérialisation XML » dans Types CLR définis par l'utilisateur.
Installez la DLL d'assembly de type dans l'instance de SQL Server à l'aide de CREATE ASSEMBLY.
Si vous n'avez pas implémenté IXMLSerializable et effectué l'étape 2, vous devez également installer la DLL d'assistant de sérialiseur XML dans l'instance de SQL Server à l'aide de CREATE ASSEMBLY.
Sérialisez le type CLR défini par l'utilisateur en données XML et incluez-les dans une structure myEndpoint**::xml** similaire à celle décrite dans la section précédente.
Une fois que le type CLR défini par l'utilisateur a été installé sur le serveur, pour transmettre une instance de ce type CLR défini par l'utilisateur dans SQL Server à partir d'une application cliente des services Web XML natifs, vous devez commencer par sérialiser le type CLR défini par l'utilisateur au format XML, puis l'inclure dans une structureXML.
Le code ci-dessous montre comment sérialiser un type CLR défini par l'utilisateur au format XML et le placer dans un élément XML (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;
Selon que le type CLR défini par l'utilisateur est présent sur le client ou non, vous pouvez être amené à désérialiser un paramètre de sortie de son format XML de type CLR défini par l'utilisateur vers son format antérieur de type défini par l'utilisateur.
Le code ci-dessous montre comment désérialiser des données XML de type défini par l'utilisateur vers le type antérieur CLR défini par l'utilisateur dans le code côté client. Dans cet exemple, le type CLR défini par l'utilisateur est 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);
Notez que vous n'êtes pas tenu d'effectuer ce processus de désérialisation si vous utilisez le type CLR défini par l'utilisateur en tant que données XML non typées sur le client.
Les types CLR définis par l'utilisateur peuvent également être transmis à une requête paramétrée sous forme de paramètres de la manière décrite pour le type de données xml. Le type CLR défini par l'utilisateur dans sa forme XML sérialisée doit être transmis à partir du client à l'aide du type myEndpoint**::xml**.
Pour une requête paramétrée mettant en jeu des types CLR définis par l'utilisateur, des valeurs différentes sont définies sur la structure System.Data.SqlClient.SqlParameter. Par exemple, les paramètres de propriétés ci-dessous sont utilisés pour les types CLR définis par l'utilisateur :
La propriété SqlDbType doit avoir la valeur Udt.
La propriété ClrTypeName doit être définie à l'aide du nom complet SQL Server en trois parties (MyDatabase**.MySchema.**MyUdtType) du type défini par l'utilisateur installé lors de son inscription dans l'instance de SQL Server.