Autor: Grasshopper Jun Fonte: Blog Hall
Vamos primeiro dar uma olhada em um trecho do código do serviço WEB.
[WebMethod]
DataTable pública GetInfo()
...{
OleDbConnection nwindConn = new OleDbConnection(
"Provedor=Microsoft.Jet.OLEDB.4.0;"
"Fonte de dados=D:\Northwind\northwind.mdb;")
;
new OleDbCommand("SELECIONE IDDoCliente, NomedaEmpresa FROM Clientes"
, nwindConn);
selectCMD.CommandTimeout = 30;
OleDbDataAdapter custDA = novo OleDbDataAdapter();
custDA.SelectCommand = selectCMD
DataSet custDS = new DataSet();
custDA.Fill(custDS, "Clientes");
retornar custDS.Tables[0];
}
No .net 1.1, este é um erro típico. No .net 1.1 e 1.0, os parâmetros de retorno ou entrada do serviço WEB não podem ser DataTable. Este é um ponto de conhecimento bem conhecido. O motivo é que o DataTable não oferece suporte à serialização como o DataSet. No .net 1.1, nossa maneira de resolver esse problema é usar o DataSet. Mas ao usar o DataSet, muitas vezes há uma sensação de exagero.
Anexo: Usar DataTable como valor de retorno do serviço WEB em .net 1.1 reportará a seguinte exceção:
O membro System.ComponentModel.MarshalByValueComponent.Site do tipo System.ComponentModel.ISite é uma interface, portanto não pode ser serializado.
No .net 2.0, o mesmo código acima funciona sem problemas. A razão é que o DataTable na versão 2.0 implementa serialização e desserialização.
Na documentação do VS2005 Beta2, podemos ver que o DataTable no 2.0 implementa as seguintes interfaces:
Implementações de Interface Explícita
System.ComponentModel.IListSource.get_ContainsListCollection
System.ComponentModel.IListSource.GetList
System.Xml.Serialization.IXmlSerializable.GetSchema
System.Xml.Serialization.IXmlSerializable.ReadXml
System.Xml.Serialization.IXmlSerializable.WriteXml
Em 1.1, DataTable implementou apenas uma interface:
Implementações de interface explícitas
System.ComponentModel.IListSource.ContainsListCollection
move algumas funções em DataSet para DataTable. Também existe um método Merge em 2.0, que mescla vários conjuntos de dados.
Para a fusão do código do DataTable, consulte o código abaixo.
vazio estático privado DemonstrateMergeTable()
...{
DataTable tabela1 = new DataTable("ItensDataColumn
coluna1 = new DataColumn("id", typeof(System.Int32));
DataColumn coluna2 = new DataColumn("item", typeof(System.Int32));
tabela1.Colunas.Add(coluna1);
tabela1.Columns.Add(coluna2);
tabela1.PrimaryKey = new DataColumn[] ...{ coluna1 };
tabela1.RowChanged += new System.Data.DataRowChangeEventHandler (Row_Changed linha)
;
para (int i = 0; i <= 3; i++)
...{
linha = tabela1.NewRow();
linha["id"] = i;
linha["item"] = i;
tabela1.Rows.Add(linha);
}
//Aceita alterações.
tabela1.AcceptChanges()
;
linha = tabela2.NewRow();
linha["id"] = 14;
linha["item"] = 774;
tabela2.Rows.Add(linha)
;
linha["id"] = 12;
linha["item"] = 555;
tabela2.Rows.Add(linha)
;
linha["id"] = 13;
linha["item"] = 665;
table2.Rows.Add(row);
// Mescla tabela2 na tabela1.
tabela1.Merge(tabela2);
}
Para resumir o que foi dito acima, o DataTable no .net 2.0 mudou de um soldado desconhecido em segundo plano para um general encarregado.