Autor: Grasshopper Jun Fuente: Blog Hall
Veamos primero un fragmento del código del servicio WEB.
[Método web]
Tabla de datos pública GetInfo()
...{
OleDbConnection nwindConn = nueva OleDbConnection(
"Proveedor=Microsoft.Jet.OLEDB.4.0;" +
"Fuente de datos=D:\Northwind\northwind.mdb;")
;
nuevo OleDbCommand("SELECCIONE ID de cliente, nombre de empresa DE clientes"
, nwindConn);
selectCMD.CommandTimeout = 30
OleDbDataAdapter custDA = nuevo OleDbDataAdapter();
custDA.SelectCommand = selectCMD
Conjunto de datos custDS = nuevo conjunto de datos();
custDA.Fill(custDS, "Clientes");
devolver custDS.Tables[0];
}
En .net 1.1, este es un error típico. En .net 1.1 y 1.0, los parámetros de entrada o retorno del servicio WEB no pueden ser DataTable. Este es un punto de conocimiento bien conocido. La razón es que DataTable no admite la serialización como DataSet. En .net 1.1, nuestra forma de resolver este problema es utilizar DataSet. Pero cuando se utiliza DataSet, a menudo hay una sensación de exceso.
Adjunto: El uso de DataTable como valor de retorno del servicio WEB en .net 1.1 informará la siguiente excepción:
El miembro System.ComponentModel.MarshalByValueComponent.Site de tipo System.ComponentModel.ISite es una interfaz, por lo que no se puede serializar.
En .net 2.0, el mismo código anterior funciona sin ningún problema. La razón es que DataTable en 2.0 implementa serialización y deserialización.
En la documentación de VS2005 Beta2, podemos ver que DataTable en 2.0 implementa las siguientes interfaces:
Implementaciones explícitas de interfaces
System.ComponentModel.IListSource.get_ContainsListCollection
System.ComponentModel.IListSource.GetList
System.Xml.Serialization.IXmlSerializable.GetSchema
System.Xml.Serialization.IXmlSerializable.ReadXml
System.Xml.Serialization.IXmlSerializable.WriteXml
En 1.1, DataTable solo implementó una interfaz:
Implementaciones de interfaz explícitas
System.ComponentModel.IListSource.ContainsListCollection
mueve algunas funciones en DataSet a DataTable. También hay un método Merge en 2.0, que combina varios conjuntos de datos.
Para la combinación de códigos de DataTable, consulte el código a continuación.
vacío estático privado DemostrarMergeTable()
...{
Tabla de datos tabla1 = nueva Tabla de datos ("Elementos");
Columna de datos columna1 = nueva Columna de datos ("id", tipo de (System.Int32));
Columna de datos columna2 = nueva columna de datos ("elemento", tipo de (System.Int32));
tabla1.Columnas.Agregar(columna1);
table1.Columns.Add(columna2);
table1.PrimaryKey = nueva columna de datos[] ...{columna1};
table1.RowChanged += new System.Data.DataRowChangeEventHandler(Row_Changed fila)
;
para (int i = 0; i <= 3; i++)
...{
fila = tabla1.NewRow();
fila["id"] = yo;
fila["elemento"] = i;
tabla1.Filas.Agregar(fila);
}
//Aceptar cambios.
tabla1.AcceptChanges();
Tabla de datos tabla2 = tabla1.Clone();
fila = tabla2.NewRow();
fila["id"] = 14;
fila["elemento"] = 774;
tabla2.Rows.Add(fila);
fila = tabla2.NewRow();
fila["id"] = 12;
fila["elemento"] = 555;
tabla2.Rows.Add(fila);
fila = tabla2.NewRow();
fila["id"] = 13;
fila["elemento"] = 665;
table2.Rows.Add(row);
// Fusiona la tabla2 con la tabla1.
tabla1.Merge(tabla2);
}
Para resumir lo anterior, DataTable en .net 2.0 ha cambiado de un soldado desconocido en segundo plano a un general a cargo.