Autor: Grasshopper Jun Quelle: Blog Hall
Schauen wir uns zunächst einen Teil des WEB-Service-Codes an.
[WebMethod]
öffentliche Datentabelle GetInfo()
...{
OleDbConnection nwindConn = new OleDbConnection(
„Provider=Microsoft.Jet.OLEDB.4.0;“
"Data Source=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, "Kunden");
return custDS.Tables[0];
}
In .net 1.1 ist dies ein typischer Fehler. In .net 1.1 und 1.0 können die Rückgabe- oder Eingabeparameter des WEB-Dienstes nicht DataTable sein. Dies ist ein bekannter Wissenspunkt. Der Grund dafür ist, dass DataTable keine Serialisierung wie DataSet unterstützt. In .net 1.1 besteht unsere Möglichkeit, dieses Problem zu lösen, darin, DataSet zu verwenden. Bei der Verwendung von DataSet entsteht jedoch oft das Gefühl, übertrieben zu sein.
Anhang: Bei Verwendung von DataTable als Rückgabewert des WEB-Dienstes in .net 1.1 wird die folgende Ausnahme gemeldet:
Das Mitglied System.ComponentModel.MarshalByValueComponent.Site vom Typ System.ComponentModel.ISite ist eine Schnittstelle und kann daher nicht serialisiert werden.
In .net 2.0 funktioniert der gleiche Code oben ohne Probleme. Der Grund dafür ist, dass DataTable in 2.0 Serialisierung und Deserialisierung implementiert.
In der Dokumentation von VS2005 Beta2 können wir sehen, dass DataTable in 2.0 die folgenden Schnittstellen implementiert:
Explizite Schnittstellenimplementierungen
System.ComponentModel.IListSource.get_ContainsListCollection
System.ComponentModel.IListSource.GetList
System.Xml.Serialization.IXmlSerializable.GetSchema
System.Xml.Serialization.IXmlSerializable.ReadXml
System.Xml.Serialization.IXmlSerializable.WriteXml
In 1.1 hat DataTable nur eine Schnittstelle implementiert:
Explizite Schnittstellenimplementierungen
System.ComponentModel.IListSource.ContainsListCollection
verschiebt einige Funktionen in DataSet nach DataTable. In 2.0 gibt es auch eine Merge-Methode, die mehrere Datensätze zusammenführt.
Informationen zur Codezusammenführung von DataTable finden Sie im folgenden Code.
private static void DemonstrateMergeTable()
...{
DataTable table1 = new DataTable("Items");
DataColumn columns1 = new DataColumn("id", typeof(System.Int32));
DataColumn Column2 = new DataColumn("item", typeof(System.Int32));
table1.Columns.Add(column1);
table1.Columns.Add(column2);
table1.PrimaryKey = new DataColumn[] ...{ columns1 };
table1.RowChanged += new System.Data.DataRowChangeEventHandler(Row_Changed)
;
for (int i = 0; i <= 3; i++)
...{
row = table1.NewRow();
row["id"] = i;
row["item"] = i;
table1.Rows.Add(row);
}
//Änderungen akzeptieren.
table1.AcceptChanges();
DataTable table2 = table1.Clone();
row = table2.NewRow();
row["id"] = 14;
row["item"] = 774;
table2.Rows.Add(row);
row = table2.NewRow();
row["id"] = 12;
row["item"] = 555;
table2.Rows.Add(row);
row = table2.NewRow();
row["id"] = 13;
row["item"] = 665;
table2.Rows.Add(row);
// Tabelle2 mit Tabelle1 zusammenführen.
table1.Merge(table2);
}
Zusammenfassend lässt sich sagen, dass sich DataTable in .net 2.0 von einem unbekannten Soldaten im Hintergrund zu einem verantwortlichen General gewandelt hat.