Compartir a través de


Controlar el tipo de datos xml y los tipos definidos por el usuario CLR

Esta característica se quitará en una versión futura de Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.

En los servicios web XML nativos a partir de SQL Server 2005, para pasar nuevos tipos, como el tipo de datos xml o los tipos definidos por el usuario CLR (Common Language Runtime), se requieren algunas tareas de desarrollo adicionales. En este tema se describen las tareas que se deben realizar para que las aplicaciones basadas en los servicios Web XML funcionen con tipos xml y tipos definidos por el usuario CLR en métodos Web y consultas con parámetros.

Nota

Se asume que tiene conocimientos básicos para implementar servicios web XML nativos en SQL Server. Debe estar familiarizado con tareas tales como crear extremos, exponer la capacidad de programación de SQL como métodos Web y escribir aplicaciones cliente Web básicas para SQL Server que utilicen otros tipos SQL integrados. Si desea revisar esta información, vea Conceptos de servicios web XML nativos, Implementar servicios Web XML nativos y Prácticas recomendadas para utilizar servicios web XML nativos.

Controlar el tipo de datos xml en aplicaciones cliente Web

Algunos detalles sobre el control correcto del tipo de datos xml en una aplicación cliente Web dependen de la situación:

  • Se está trabajando con un procedimiento almacenado que se expone como un método Web en un extremo.

  • Se está utilizando la funcionalidad de lotes SQL (sqlbatch) del extremo para ejecutar una consulta con parámetros.

En estos dos casos es necesario controlar las instancias con parámetros del tipo de datos xml mediante el uso y llenado de una estructura miExtremo**::xml**. En esta estructura, miExtremo representa el verdadero nombre del extremo que se utiliza cuando se pasan instancias del tipo de datos xml en el código de cliente. Esta estructura se declara en la clase de proxy Web del extremo.

La estructura miExtremo**::xml** se crea al agregar o actualizar la referencia Web al extremo que expone el método Web en el proyecto de Visual Studio. No obstante, deberá llenar la estructura miExtremo**::xml** inicial generada en la clase de proxy Web personalizada según corresponda, dependiendo de si utiliza XML con tipo o XML sin tipo en el código de aplicación de cliente.

La estructura miExtremo**::xml** expone las instancias de parámetros de tipo de datos xml sin tipo de los métodos Web como una matriz de tipo System.Xml.XmlNode en la clase de proxy. Por tanto, para pasar una instancia de parámetro de tipo de datos xml, deberá crear y llenar manualmente una matriz de nodos XML, o, preferiblemente, utilice System.Xml.XmlDocumentFragment. Para obtener más información, vea Trabajar con el tipo de datos xml en aplicaciones cliente de Visual Studio.

Para xml con tipo en métodos Web, se genera un tipo personalizado en la clase proxy Web y se le asigna un nombre con este formato: el nombre del método concatenado con la palabra Type y seguido por el nombre del parámetro. Por ejemplo, si el método Web se expone con el nombre GetXmlInfo y utiliza un parámetro de tipo de datos xml denominado T para pasar XML con tipo como entrada, el nombre del tipo personalizado expuesto en la clase de proxy Web será GetXmlInfoTypeT. Este tipo personalizado hereda de la estructura miExtremo**::xml**, por lo que expone, de manera similar, el XML con tipo como una matriz de System.Xml.XmlNode.

Controlar el tipo de datos xml en consultas con parámetros es parecido a trabajar con el tipo de datos xml en métodos Web con una excepción: el XML con tipo debe pasarse desde el cliente utilizando el mismo tipo (myEndpoint**::xml**) que se utiliza con el XML sin tipo.

Una vez que la estructura miExtremo**::xml** está preparada, se puede exponer la instancia del tipo de datos xml como una matriz de System.Xml.XmlNode en la estructura definida y, ésta, a su vez, puede incluirse en el objeto SqlParameter.Value.

Una consulta con parámetros requiere la funcionalidad de lotes SQL. Para ello, pueden ser necesarios los siguientes preparativos adicionales:

  • El extremo debe tener SQL habilitado. Esto significa que se utilizó BATCHES=ENABLED al crear o modificar el extremo.

  • En la clase de proxy Web, se incluirá el método sqlbatch() cuando se agregue o actualice una referencia Web para un extremo con lotes habilitados.

Para los parámetros XML con tipo, se actualiza el método sqlbatch() de la clase de proxy Web para incluir la configuración de propiedades adicionales (XmlSchemaCollectionDatabase, XmlSchemaCollectionName, XmlSchemaCollectionOwningSchema) relacionadas con el registro de una colección de esquemas XML para el objeto System.Data.SqlClient.SqlParameter.

Nota

Para los métodos Web y las consultas con parámetros que exponen el tipo de datos xml, donde se devuelve System.Data.DataSet en la salida (como parte de una matriz de objetos) y el contenido se coloca en un objeto DataGrid para visualizar los resultados en la aplicación cliente, DataSet no utiliza el tipo de proxy Web (miExtremo::xml), sino el tipo CLR System.Data.SqlTypes.SqlXml.

Controlar los tipos definidos por el usuario CLR con aplicaciones cliente Web

Para controlar los tipos definidos por el usuario CLR en una aplicación cliente Web, se deben realizar los pasos siguientes:

  1. Escriba el tipo definido por el usuario CLR y compílelo en una DLL, como MyType.dll.

    En Visual Studio 2005, escriba el tipo definido por el usuario CLR (clase o estructura) y compílelo en un ensamblado. El ensamblado del tipo debe cumplir los requisitos de SQL Server para implementar tipos definidos por el usuario. De esta manera, se podrá instalar y registrar el ensamblado en una instancia de SQL Server. Para obtener más información, vea la sección donde se describen los requisitos para implementar los tipos definidos por el usuario (UDT) en Tipos definidos por el usuario de CLR.

  2. Para generar una DLL complementaria del serializador XML, si no ha implementado IXMLSerializable, ejecute Sgen.exe en la DLL del ensamblado del tipo. Tendrá un nombre similar a miTipo.XmlSerializers.dll.

    Además de cumplir los requisitos básicos para poder utilizarse con SQL Server, el tipo definido por el usuario CLR también debe poder serializarse como XML para funcionar con los servicios web XML nativos de SQL Server. Para obtener más información, vea la sección donde se describe la serialización XML en Tipos definidos por el usuario de CLR.

  3. Instale la DLL del ensamblado del tipo en la instancia de SQL Server mediante CREATE ASSEMBLY.

    Si no ha implementado IXMLSerializable pero ha completado el paso 2, también deberá instalar el archivo DLL complementario del serializador XML en la instancia de SQL Server mediante CREATE ASSEMBLY.

  4. Serialice el tipo definido por el usuario CLR como XML e inclúyalo en una estructura miExtremo**::xml** similar a la descrita en la sección anterior.

    Una vez que se ha instalado el tipo definido por el usuario CLR en el servidor, para pasar una instancia de ese tipo a SQL Server desde una aplicación cliente de servicios web XML nativos, primero debe serializar el tipo en formato XML e incluirlo en una estructura XML.

    El código siguiente muestra cómo serializar un tipo definido por el usuario CLR en formato XML y cómo colocarlo en un elemento 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;
    
  5. Dependiendo de si el tipo definido por el usuario CLR está presente en el cliente, posiblemente también será necesario deserializar el parámetro de salida desde el formato XML del tipo definido por el usuario CLR al formato del tipo definido por el usuario previo.

    El código siguiente muestra cómo deserializar el XML del tipo definido por el usuario al tipo definido por el usuario CLR anterior en el código del cliente. En este ejemplo, el tipo definido por el usuario CLR es 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);
    

    Tenga en cuenta que no tendrá que realizar la operación de deserialización si utiliza el tipo definido por el usuario CLR como XML sin tipo en el cliente.

Los tipos definidos por el usuario CLR también se pueden pasar como parámetros a una consulta con parámetros de la misma manera que se ha descrito para el tipo de datos xml. Para pasar el tipo definido por el usuario CLR serializado como XML desde el cliente, se debe utilizar el tipo miExtremo**::xml**.

Con una consulta con parámetros que incluye tipos definidos por el usuario CLR, se establecen varios valores en la estructura System.Data.SqlClient.SqlParameter. Por ejemplo, para los tipos definidos por el usuario CLR se utilizan los siguientes valores de propiedades:

  • La propiedad SqlDbType se debe establecer en un valor de Udt.

  • La propiedad ClrTypeName debe establecerse en el nombre SQL Server de tres partes (miBaseDeDatos**.miEsquema.**miTipoUDT) que corresponde al tipo definido por el usuario instalado tal como está registrado en la instancia de SQL Server.