Auteur : Grasshopper Jun Source : Blog Hall
Examinons d'abord un morceau de code du service WEB.
[MéthodeWeb]
Table de données publique GetInfo()
...{
OleDbConnection nwindConn = nouveau OleDbConnection (
"Fournisseur=Microsoft.Jet.OLEDB.4.0;"
"Source de données = D:\Northwind\northwind.mdb;");
OleDbCommand selectCMD =
new OleDbCommand ("SELECT CustomerID, CompanyName FROM Customers"
, nwindConn);
selectCMD.CommandTimeout = 30 ;
OleDbDataAdapter custDA = new OleDbDataAdapter();
custDA.SelectCommand = selectCMD;
DataSet custDS = new DataSet();
custDA.Fill(custDS, "Clients");
renvoie custDS.Tables[0] ;
}
Dans .net 1.1, il s'agit d'une erreur typique. Dans .net 1.1 et 1.0, les paramètres de retour ou d'entrée du service WEB ne peuvent pas être DataTable. Il s'agit d'un point de connaissance bien connu. La raison est que DataTable ne prend pas en charge la sérialisation comme DataSet. Dans .net 1.1, notre façon de résoudre ce problème consiste à utiliser DataSet. Mais lorsque l’on utilise DataSet, on a souvent un sentiment d’excès.
Pièce jointe : l'utilisation de DataTable comme valeur de retour du service WEB dans .net 1.1 signalera l'exception suivante :
Le membre System.ComponentModel.MarshalByValueComponent.Site de type System.ComponentModel.ISite est une interface, il ne peut donc pas être sérialisé.
Dans .net 2.0, le même code ci-dessus fonctionne sans aucun problème. La raison en est que DataTable 2.0 implémente la sérialisation et la désérialisation.
Dans la documentation de VS2005 Beta2, nous pouvons voir que DataTable en 2.0 implémente les interfaces suivantes :
Implémentations d'interface explicites
System.ComponentModel.IListSource.get_ContainsListCollection
System.ComponentModel.IListSource.GetList
System.Xml.Serialization.IXmlSerializing.GetSchema
System.Xml.Serialization.IXmlSerializing.ReadXml
System.Xml.Serialization.IXmlSerialised.WriteXml
Dans la version 1.1, DataTable n'implémentait qu'une seule interface :
implémentations d'interface explicites
System.ComponentModel.IListSource.ContainsListCollection
déplace certaines fonctions de DataSet vers DataTable. Il existe également une méthode Merge dans la version 2.0, qui fusionne plusieurs ensembles de données.
Pour la fusion du code de DataTable, veuillez vous référer au code ci-dessous.
vide statique privé DemonstrateMergeTable()
...{
DataTable table1 = new DataTable("Items");
DataColumn column1 = new DataColumn("id", typeof(System.Int32));
Colonne DataColumn2 = new DataColumn("item", typeof(System.Int32));
table1.Columns.Add(colonne1);
table1.Columns.Add(colonne2);
table1.PrimaryKey = new DataColumn[] ...{ colonne1 };
table1.RowChanged += new System.Data.DataRowChangeEventHandler (Row_Changed
ligne DataRow);
pour (int i = 0; i <= 3; i++)
...{
rangée = table1.NewRow();
rangée["id"] = je;
rangée["élément"] = je;
table1.Rows.Add(ligne);
}
//Accepter les modifications.
table1.AcceptChanges();
DataTable table2 = table1.Clone();
rangée = table2.NewRow();
ligne["id"] = 14;
ligne["élément"] = 774;
table2.Rows.Add(ligne);
ligne = table2.NewRow();
ligne["id"] = 12;
ligne["élément"] = 555;
table2.Rows.Add(ligne);
ligne = table2.NewRow();
ligne["id"] = 13;
ligne["élément"] = 665;
table2.Rows.Add(row);
// Fusionner la table2 dans la table1.
table1.Merge(table2);
}
Pour résumer ce qui précède, DataTable dans .net 2.0 est passé d'un soldat inconnu en arrière-plan à un général en charge.