No puede crear un formulario desde un servicio Web que devuelve un conjunto de datos de ADO.NET en InfoPath 2003

Seleccione idioma Seleccione idioma
Id. de artículo: 822020 - Ver los productos a los que se aplica este artículo
Para obtener una versión de Microsoft Visual Basic .NET de este artículo, consulte 831795.
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando se crea un formulario de InfoPath de un servicio Web que devuelve un DataSet de ADO.NET (System.Data.DataSet), puede recibir el siguiente mensaje de error desde InfoPath:
El archivo de datos XML contiene información de esquema XML, lo cual no está permitido.

Causa

InfoPath no puede utilizar directamente ADO.NET. InfoPath trabaja con cargas XML genéricas. DataSet de ADO.NET que se devuelven los servicios Web se serializan como un formato XML especial que impide que los conjuntos de datos ADO.NET trabajar directamente con InfoPath.
  • En el archivo de lenguaje de descripción de servicios Web que define los métodos y propiedades de un servicio Web, el tipo DataSet se representa mediante una etiqueta de esquema abierto < xsd: cualquier / >. InfoPath puede inferir el esquema de un documento XML devuelto por un servicio Web. Sin embargo, InfoPath debe realizar un ejemplo llamar a pendientes de servicio Web.
  • Un DataSet de ADO.NET contiene un esquema en línea que describe los datos almacenados en la misma. Esta versión de InfoPath no admite esquemas en línea.
  • Los datos de un DataSet de ADO.NET se empaquetan en un elemento XML <diffgr:diffgram> que no se describe en el esquema en línea. Los elementos XML que contienen los datos del DataSet de ADO.NET también tienen atributos adicionales que no se describen en el esquema. Porque los datos no coincide con el esquema, no se puede validar los datos en el formulario de InfoPath.
  • InfoPath no tiene compatibilidad integrada para seguimiento de cambios que es similar a un DataSet de ADO.NET. Por ejemplo, un DataSet de ADO.NET realiza un seguimiento los campos y las filas que han agregado, cambiadas o eliminado cambios fueron últimos aceptan. (Esto es el propósito del elemento de diffgram y el espacio de nombres "diffgr" en la secuencia XML.) Para admitir cambios, InfoPath podrían tener que en .NET Framework de envío y un conjunto de datos de host objeto para administrar los datos XML o volver a implementar la funcionalidad. Ninguna de estas opciones está disponible en esta versión de InfoPath.

Solución

Este problema se resuelve en Microsoft Office InfoPath 2003 Service Pack 1 (SP1). Para resolver este problema, obtenga el service pack más reciente para Microsoft Office 2003. InfoPath 2003 SP1 totalmente admite conjuntos de datos con tipo y le permite crear un formulario de un servicio Web que devuelve un DataSet en InfoPath 2003.

Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
870924Cómo obtener el service pack más reciente para Office 2003
Para evitar este problema, cree un nuevo método de servicio Web que toma DataSet de ADO.NET que se devuelve desde el método de servicio Web original. Quitar el esquema en línea, los elementos de diffgram y los atributos. Devolver el XML limpios a InfoPath. Consulte la sección "Más información" para dos implementaciones posibles de esta solución.

Estado

Este comportamiento es por diseño.

Más información

Pasos para reproducir el comportamiento

  1. En Microsoft Visual Studio. NET, cree un nuevo proyecto de servicio Web ASP.NET en Microsoft C#. Cambie el nombre de este proyecto a NorthwindDataSet .

    Para ello puede cambiar la ubicación a http://localhost/NorthwindDataSet.
  2. En el menú proyecto , haga clic en Agregar servicio Web . Nombre del nuevo servicio Web CustomerInfo.asmx .
  3. Agregue el código siguiente al nuevo servicio CustomerInfo.asmx Web:
    /************************************************************************
       * GetCustomerInfo -- This method retrieves information from the 
       * Customer table of the Northwind database and then returns it in an
       * ADO.NET DataSet.
       * Parameters: CustomerID is the string that contains the CustomerID of the 
       *                           customer to retrieve the information for.
       * Returns: An ADO.NET DataSet that contains information about the customer.
       * *********************************************************************/
    [WebMethod]
    public System.Data.DataSet GetCustomerInfo( string CustomerID )
    {
       try
       {
          //Create a Microsoft SQL Server connection to the local SQL Server.
          System.Data.SqlClient.SqlConnection theConnection = new SqlConnection();
          theConnection.ConnectionString = "Data Source=(local);" + 
             "Integrated Security=SSPI;Initial Catalog=northwind";
          
          //Create an SQL Command to query the data.
          System.Data.SqlClient.SqlCommand theCommand = new SqlCommand();
          theCommand.Connection = theConnection;
          theCommand.CommandText = "SELECT \"CustomerID\",\"CompanyName\"," + 
             "\"ContactName\",\"ContactTitle\",\"Address\",\"City\",\"Region\"," + 
             "\"PostalCode\",\"Country\",\"Phone\",\"Fax\" FROM \"Customers\" " + 
             "WHERE CustomerID='" + CustomerID + "'";
       
          //Create an SQL DataAdapter to read the data.
          System.Data.SqlClient.SqlDataAdapter theDataAdapter = new SqlDataAdapter();
          theDataAdapter.SelectCommand = theCommand;
    
          //Open the command, and then read the data.
          theConnection.Open();
          System.Data.DataSet theCustomerInfo = new DataSet();
          theCustomerInfo.DataSetName = "CustomerInfo";
          theCustomerInfo.Namespace = "http://localhost/NorthwindDataSet/CustomerInfo";
          theDataAdapter.Fill( theCustomerInfo, "Customers" );
    
          //Clean up.
          theConnection.Close();
       
          //Return the result.
          return theCustomerInfo;
       }
       catch(Exception ex)
       {
          return null;
       }
    }
    
    el código de ejemplo intenta conectarse a un equipo que ejecuta Microsoft SQL Server en el mismo equipo que el servicio Web. Como alternativa, puede cambiar la cadena de conexión se utiliza por el objeto System.Data.SqlConnection para conectar a un equipo diferente que ejecuta SQL Server. Quizás tenga que configurar SQL Server permisos para permitir que el servicio Web para tener acceso a la base de datos.Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
    815154Cómo: Configurar la seguridad de SQL Server para aplicaciones .NET
  4. En la parte superior de la página CustomerInfo.asmx.cs, agregue el código siguiente a las instrucciones USING :
    using System.Data.SqlClient;
  5. Compilar el proyecto de NorthwindDataSet .
  6. Iniciar InfoPath. En el menú archivo , haga clic en diseñar un formulario .
  7. En el panel de tareas un formulario de diseñar, haga clic en a partir de origen de datos .
  8. En el cuadro de diálogo Asistente para configuración de orígenes de datos , seleccione Servicio Web como el tipo de origen de datos y, a continuación, haga clic en siguiente .
  9. Seleccione Recibir datos y, a continuación, haga clic en siguiente .
  10. Escriba la dirección URL al servicio Web de CustomerInfo (por ejemplo, http://localhost/NorthwindDataSet/CustomerInfo.asmx) y, a continuación, haga clic en siguiente .
  11. Seleccione el método GetCustomerInfo para la operación y, a continuación, haga clic en siguiente .
  12. Seleccione el parámetro s0:CustomerID y, a continuación, haga clic en Establecer valor de ejemplo... . En el cuadro de diálogo Establecer valor , escriba ALFKI y, a continuación, haga clic en Aceptar .
  13. Haga clic en siguiente .

    Nota InfoPath muestra el mensaje de error que está en la sección "Síntomas".

Soluciones provisionales

Para evitar el problema, puede utilizar los pasos que son similares a los siguientes pasos para agregar un método de servicio Web nuevo que quita los elementos incompatibles el XML del DataSet de ADO.NET. Para ello para que los datos XML pueden utilizarse por InfoPath. El método de servicio Web puede quitar la información de esquema en línea de los datos XML o el método de servicio Web puede serializar los datos XML de una clase contenedora inflexible y devolver.

Cada método tiene ventajas e inconvenientes.

Solución 1

Quitar el esquema en línea y los atributos XML incompatible

Esta alternativa es conveniente porque es fácil de implementar. Además, si los datos XML que devuelve el servicio Web original se cambian por cualquier motivo, esta solución no requiere ningún cambio para trabajar con los nuevos datos.

Sin embargo, esta solución también tiene una desventaja. Esta solución no describe el esquema de los datos XML. Por consiguiente, InfoPath debe inferir el esquema de datos de ejemplo. Si los datos de ejemplo no contienen todos los posibles elementos y atributos que puede devolver el método de servicio Web, el esquema que InfoPath deduce no contendrá esos elementos. Si ejecuta una consulta que devuelve los elementos o atributos que no están en la llamada de ejemplo, InfoPath muestra un error.

Para implementar la solución 1, siga estos pasos:
  1. En Visual Studio. NET, abra el proyecto de NorthwindDataSet.
  2. En el menú proyecto , haga clic en Agregar servicio Web . Nombre del nuevo servicio Web IPCustomerInfo.asmx .
  3. Agregue el código siguiente al nuevo servicio IPCustomerInfo.asmx Web:
    /************************************************************************
       * GetCustomerInfoNoSchema: This method calls the GetCustomerInfo
       * method of the CustomerInfo.asmx Web service, and then strips the 
       * inline schema from the resulting DataSet.
       * Parameters: CustomerID is the string that contains the CustomerID of the 
       *                           customer to retrieve information for.
       * Returns: An XML Document with no inline schema.
       * *********************************************************************/
    [WebMethod]
    public System.Xml.XmlDocument GetCustomerInfoNoSchema( string CustomerID )
    {
       //Get the core data.
       CustomerInfo theCustomerInfoService = new CustomerInfo();
       System.Data.DataSet theDataSet = 
          theCustomerInfoService.GetCustomerInfo( CustomerID );
    
       //Create a new XmlDocument from the data of the dataset.
       System.Xml.XmlDocument theDocument = new System.Xml.XmlDocument();
       theDocument.LoadXml( theDataSet.GetXml() );
    
       //Return the result.
       return theDocument;
    }
    
    el código de ejemplo utiliza el servicio Web original para proporcionar un DataSet y, a continuación, crea un nuevo documento XML sin información de esquema en línea.
  4. Compilar el proyecto de NorthwindDataSet.
  5. Iniciar InfoPath. En el menú archivo , haga clic en diseñar un formulario .
  6. En el panel de tareas un formulario de diseñar, haga clic en a partir de origen de datos .
  7. En el cuadro de diálogo Asistente para configuración de orígenes de datos , seleccione Servicio Web como el tipo de origen de datos y, a continuación, haga clic en siguiente .
  8. Seleccione Recibir datos y, a continuación, haga clic en siguiente .
  9. Escriba la dirección URL al servicio Web de IPCustomerInfo (por ejemplo, http://localhost/NorthwindDataSet/IPCustomerInfo.asmx) y, a continuación, haga clic en siguiente .
  10. Seleccione el método GetCustomerInfoNoSchema para la operación y, a continuación, haga clic en siguiente .
  11. Seleccione el parámetro s0:CustomerID y, a continuación, haga clic en Establecer valor de ejemplo . En el cuadro de diálogo Establecer valor , escriba ALFKI y, a continuación, haga clic en Aceptar .
  12. Haga clic en siguiente y, a continuación, haga clic en Finalizar .
  13. Mover el campo IdCliente desde el grupo queryFields en el panel de tareas origen de datos y, a continuación, agregue el campo IdCliente a la vista de consulta .
  14. Mover el grupo de clientes desde el grupo dataFields en el panel de tareas origen de datos y, a continuación, agregue el grupo de clientes a la vista Entrada de datos . Haga clic en sección con controles .
  15. Obtener una vista previa y pruebe el formulario. Observe que para algunos identificadores, como la REINA de cliente, la consulta encuentra errores porque los datos de ejemplo no contienen todos los elementos posibles que el servicio Web puede devolver.

Solución 2

Crear una clase de contenedor con establecimiento inflexible de tipos para serializar los datos XML del DataSet de ADO.NET

Esta solución es más difícil de implementar que la solución anterior. Además, esta solución se debe adaptar a cada método de servicio Web que se utiliza con y que el método de servicio de Web no debe cambiar el esquema de los datos que devuelve. Sin embargo, esta solución describe el esquema de los datos XML que devuelve. Por consiguiente, InfoPath no tiene que deducir la estructura de los datos. Como resultado, los formularios de InfoPath creados a partir de esta solución no son susceptibles a errores ocasionados por atributos y elementos opcionales.
  1. En Microsoft Internet Explorer, desplácese a la dirección URL de la página de prueba del servicio Web de CustomerInfo (por ejemplo, http://localhost/NorthwindDataSet/CustomerInfo.asmx).
  2. Haga clic en GetCustomerInfo para desplazarse a la página de prueba para ese método.
  3. En el cuadro de texto IdCliente , escriba ALFKI y, a continuación, haga clic en invocar .
  4. Desde el código XML que da como resultado, copie el <xs:schema> elemento y todos sus elementos secundarios y, a continuación, pegar en un texto nuevo documento en el Bloc de notas.
  5. Quite los caracteres - el texto pegado y, a continuación, guarde el documento como CustomerInfo.xsd .
  6. Abra un símbolo del sistema de Visual Studio .NET y vaya al directorio donde guardó CustomerInfo.xsd.
  7. Utilice la línea siguiente para crear una clase de contenedor desde el archivo de esquema:
    xsd.exe CustomerInfo.xsd /c /l:cs
  8. En Visual Studio. NET, abra el proyecto de NorthwindDataSet.
  9. En el menú proyecto , haga clic en Agregar elemento existente .
  10. Mover al archivo CustomerInfo.cs que creó con la herramienta XSD.exe y, a continuación, haga clic en Abrir .
  11. Agregue el espacio de nombres CustomerInfoWrapper alrededor de la clase CustomerInfo y la clase CustomerInfoCustomers .
  12. Agregue el código siguiente al servicio IPCustomerInfo.asmx Web:
    /************************************************************************
       * GetCustomerInfoWrapper: This method calls the GetCustomerInfo
       * method of the CustomerInfo.asmx Web service, and then strips the 
       * inline schema from the resulting DataSet.
       * Parameters: CustomerID is the string that contains the CustomerID of the 
       *                           customer to retrieve information for.
       *                        exampleData is the wrapper class to fill with the data from the
       *                           ADO.NET DataSet.
       * Returns: none
       * *********************************************************************/
    [WebMethod]
    public void GetCustomerInfoWrapper( string CustomerID, 
       out CustomerInfoWrapper.CustomerInfo exampleData )
    {
       //Get the core data.
       CustomerInfo theCustomerInfoService = new CustomerInfo();
       System.Data.DataSet theDataSet = 
          theCustomerInfoService.GetCustomerInfo( CustomerID );
       theDataSet.Namespace = "http://localhost/NorthwindDataSet/CustomerInfo";
    
       //Create an in-memory stream to write the DataSet to.
       System.IO.MemoryStream theStream = new System.IO.MemoryStream();
    
       //Write the DataSet to the stream.
       theDataSet.WriteXml( theStream, XmlWriteMode.IgnoreSchema );
    
       //Move the streams seek pointer back to the beginning, or 
       //deserialization will fail.
       theStream.Seek(0, System.IO.SeekOrigin.Begin );
    
       //Create an XML Serializer to read the DataSet.
       System.Xml.Serialization.XmlSerializer ser = new
          System.Xml.Serialization.XmlSerializer(
             typeof(CustomerInfoWrapper.CustomerInfo));
    
       //Deserialize a CustomerInfo wrapper from the stream.
       exampleData = ((CustomerInfoWrapper.CustomerInfo)
          (ser.Deserialize( theStream )));
       return;
    }
    
    el código de ejemplo utiliza el servicio Web original para proporcionar un DataSet y, a continuación, crea un nuevo documento XML sin información de esquema en línea.
  13. Compilar el proyecto de NorthwindDataSet.
  14. Iniciar InfoPath. En el menú archivo , haga clic en diseñar un formulario .
  15. En el panel de tareas un formulario de diseño, haga clic en nuevo de origen de datos.. .
  16. En el cuadro de diálogo Asistente para configuración de orígenes de datos , seleccione Servicio Web como el tipo de origen de datos y, a continuación, haga clic en siguiente .
  17. Seleccione Recibir datos y, a continuación, haga clic en siguiente .
  18. Escriba la dirección URL al servicio Web de IPCustomerInfo (por ejemplo, http://localhost/NorthwindDataSet/IPCustomerInfo.asmx) y, a continuación, haga clic en siguiente .
  19. Para la operación, seleccione el método GetCustomerInfoWrapper y, a continuación, haga clic en siguiente .

    Observe que InfoPath no le pide que especificar valores de ejemplo para el método de servicio Web.
  20. Haga clic en Finalizar .
  21. Mover el campo IdCliente desde el grupo queryFields en el panel de tareas origen de datos y, a continuación, agregue el campo IdCliente a la vista de consulta.
  22. Mover el grupo de clientes desde el grupo dataFields en el panel de tareas origen de datos y, a continuación, agregue el grupo de clientes a la vista Entrada de datos .
  23. Obtener una vista previa y, a continuación, pruebe el formulario.

    Observe que cualquier ID de cliente válido funciona en este formulario.

Propiedades

Id. de artículo: 822020 - Última revisión: viernes, 28 de julio de 2006 - Versión: 2.4
La información de este artículo se refiere a:
  • Microsoft Office InfoPath 2003
Palabras clave: 
kbmt kbtshoot kbxml kbprb KB822020 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 822020

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com