Problemas al utilizar un servicio Web XML que devuelve un objeto DataTable

Seleccione idioma Seleccione idioma
Id. de artículo: 306134 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Al examinar en la dirección URL de un servicio Web XML que devuelve una DataTable desde uno de sus métodos Web, puede recibir el siguiente mensaje de error:
No se puede serializar System.Data.DataRelation porque no tiene un constructor público predeterminado.
También puede ver un mensaje de error similar al siguiente cuando intenta establecer una Web referencia a este servicio Web XML en el entorno de desarrollo integrado (IDE) de Visual Studio.NET:
Error interno del servidor. No se puede solicitar "http://localhost/Webservice1/Service1.asmx?WSDL". El servidor respondió con código de error "ProtocolError".
Con el .NET Framework 1.1 Service Pack 1 (SP1), puede recibir el siguiente mensaje de error:
System.NotSupportedException: No se puede serializar el miembro System.ComponentModel.MarshalByValueComponent.Site de tipo System.ComponentModel.ISite porque es una interfaz.
También puede recibir una página en blanco en lugar de cualquiera de estos mensajes de error si Mostrar mensajes de error HTTP descriptivos está habilitada en Microsoft Internet Explorer. De forma predeterminada, la opción Mostrar mensajes de error HTTP descriptivos está habilitada.

Si intenta agregar una referencia Web a un servicio Web XML que devuelve un objeto DataTable, puede recibir el siguiente mensaje de error:
El documento en la dirección url http://<server>/vdir/service1.asmx no se reconoce como un tipo de documento conocido.

Causa

Los objetos DataTable , DataRow , DataView y DataViewManager no se puede serializar y no puede devolverse desde un XML Web service. Para devolver menos de un DataSet completa, debe copiar los datos que desea volver a un nuevo DataSet .

Solución

Para resolver este problema, devolver un conjunto de datos en lugar de una DataTable . objetos DataSet pueden contener uno o más objetos de DataTable .

Estado

Este comportamiento es por diseño.

Más información

Pasos para reproducir el comportamiento

Nota : código de ejemplo se proporciona para Visual Basic.NET, Visual C# .NET y Visual J#. NET.
  1. Agregue un método Web que devuelve un objeto DataTable a un servicio Web XML existente. El código siguiente crea una conexión a una base de datos de Microsoft SQL Server y recupera la tabla authors. Si desea utilizar el código, modifíquelo para conectarse a uno de SQL Server los equipos.
    'Visual Basic
        <WebMethod()> Function GiveMeADataTable() As System.Data.DataTable
            Dim conn As New System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;")
            Dim ds As New System.Data.DataSet()
            Dim adapter As New System.Data.SqlClient.SqlDataAdapter()
            adapter.SelectCommand = New System.Data.SqlClient.SqlCommand("Select * From Authors", conn)
            adapter.Fill(ds, "Authors")
            Return ds.Tables("Authors")
        End Function
    					
    //Visual C#
       [WebMethod]
       public System.Data.DataTable GiveMeADataTable()
       {
            System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
          System.Data.DataSet ds = new System.Data.DataSet();
            System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
            adapter.SelectCommand = new System.Data.SqlClient.SqlCommand("Select * From Authors", conn);
            adapter.Fill(ds, "Authors");
          return ds.Tables["Authors"];
       }    
    
    					
    /**Visual J# */ 
    	/** @attribute WebMethod() */ 
    	public System.Data.DataTable GiveMeADataTable()
    	{
    		System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
    		System.Data.DataSet ds = new System.Data.DataSet();
    		System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
    		adapter.set_SelectCommand(new System.Data.SqlClient.SqlCommand("Select * From Authors", conn));
    		adapter.Fill(ds, "Authors");
    		System.Data.DataTableCollection dtc = ds.get_Tables();
    		return dtc.get_Item("Authors");
    	} 
    					
  2. Compile el servicio Web XML.
  3. Busque la dirección URL del servicio Web XML en el que acaba de agregar el código. Tenga en cuenta que recibirá un mensaje de error.
  4. Modifique el código como sigue, para devolver un conjunto de datos en lugar de una DataTable :
    'Visual Basic
        <WebMethod()> Function GiveMeADataSet() As System.Data.DataSet
            Dim conn As New System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;")
            Dim ds As New System.Data.DataSet()
            Dim adapter As New System.Data.SqlClient.SqlDataAdapter()
            adapter.SelectCommand = New System.Data.SqlClient.SqlCommand("Select * From Authors", conn)
            adapter.Fill(ds, "Authors")
            Return ds
        End Function
    					
    //Visual C#
       [WebMethod]
       public System.Data.DataSet GiveMeADataSet()
       {
            System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
          System.Data.DataSet ds = new System.Data.DataSet();
            System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
            adapter.SelectCommand = new System.Data.SqlClient.SqlCommand("Select * From Authors", conn);
            adapter.Fill(ds, "Authors");
          return ds;
       }
    
    					
    /**Visual J# */ 
    /** @attribute WebMethod() */ 
    	public System.Data.DataSet GiveMeADataSet()
    	{
    		System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
    		System.Data.DataSet ds = new System.Data.DataSet();
    		System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
    		adapter.set_SelectCommand(new System.Data.SqlClient.SqlCommand("Select * From Authors", conn));
    		adapter.Fill(ds, "Authors");
    		return ds;
    	}
    					
  5. Compile el servicio Web XML.
  6. Busque la dirección URL del servicio Web XML en el que acaba de agregar el código anterior. Tenga en cuenta que no reciben una mensaje de error.

Propiedades

Id. de artículo: 306134 - Última revisión: lunes, 25 de octubre de 2004 - Versión: 6.5
La información de este artículo se refiere a:
  • Microsoft Web Services (included with the .NET Framework) 1.0
  • Microsoft Web Services Enhancements for Microsoft .NET 1.1
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.0
  • Microsoft Visual J# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft ASP.NET 1.1
Palabras clave: 
kbmt kbprb kbprod2web KB306134 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): 306134

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