作者: 蝈蝈俊 出处: 博客堂
我们先看一段WEB Service的代码。
[WebMethod]
public DataTable GetInfo()
...{
OleDbConnection nwindConn = new OleDbConnection(
"Pr***der=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=D:\Northwind\no***wind.mdb;");
OleDbCommand selectCMD =
new OleDbCommand("SELECT CustomerID, CompanyName FROM Customers"
, nwindConn);
se***tCMD.CommandTimeout = 30;
OleDbDataAdapter custDA = new OleDbDataAdapter();
cu***A.SelectCommand = selectCMD;
DataSet custDS = new DataSet();
cu***A.Fill(custDS, "Customers");
return cu***S.Tables[0];
}
在.net 1.1 中,这是典型的一个错误,在.net 1.1 、1.0中,WEB Service 的返回或者输入参数不能是 DataTable,这是一个众人皆知的知识点。原因就是 DataTable 不象DataSet那样支持序列化。在.net 1.1中,我们解决这个问题的方法就是使用DataSet。但是使用DataSet 的时候,经常会有一种杀鸡用牛刀的感觉。
附:.net 1.1 中使用DataTable作为WEB Service 返回值会报以下异常:
类型 Sy***m.ComponentModel.ISite 的成员 Sy***m.ComponentModel.MarshalByValueComponent.Site 是接口,因此无法将其序列化。
在.net 2.0 中,以上同样的代码,则没有任何问题了。原因是2.0中 DataTable实现了序列化、反序列。
在VS2005 Beta2 的文档中,我们可以看到2.0 中 DataTable实现了以下接口:
Explicit Interface Implementations
Sy***m.ComponentModel.IListSource.get_ContainsListCollection
Sy***m.ComponentModel.IListSource.GetList
Sy***m.Xml.Serialization.IXmlSerializable.GetSchema
Sy***m.Xml.Serialization.IXmlSerializable.ReadXml
Sy***m.Xml.Serialization.IXmlSerializable.WriteXml
而在1.1中,DataTable 只实现了一个接口:
Explicit Interface Implementations
Sy***m.ComponentModel.IListSource.ContainsListCollection
把DataSet中的一些功能移到 DataTable中,2.0 中还有 Merge 方法,即合并数个数据集。
DataTable的代码合并参看下面代码。
private static void DemonstrateMergeTable()
...{
DataTable table1 = new DataTable("Items");
DataColumn column1 = new DataColumn("id", typeof(Sy***m.Int32));
DataColumn column2 = new DataColumn("item", typeof(Sy***m.Int32));
ta***1.Columns.Add(column1);
ta***1.Columns.Add(column2);
ta***1.PrimaryKey = new DataColumn[] ...{ column1 };
ta***1.RowChanged += new Sy***m.Data.DataRowChangeEventHandler(Row_Changed);
DataRow row;
for (int i = 0; i <= 3; i++)
...{
row = ta***1.NewRow();
row["id"] = i;
row["item"] = i;
ta***1.Rows.Add(row);
}
// Accept changes.
ta***1.AcceptChanges();
DataTable table2 = ta***1.Clone();
row = ta***2.NewRow();
row["id"] = 14;
row["item"] = 774;
ta***2.Rows.Add(row);
row = ta***2.NewRow();
row["id"] = 12;
row["item"] = 555;
ta***2.Rows.Add(row);
row = ta***2.NewRow();
row["id"] = 13;
row["item"] = 665;
ta***2.Rows.Add(row);
// Merge table2 into the table1.
ta***1.Merge(table2);
}
综合上述,.net 2.0 中 DataTable 从后台的默默无问的小兵变成独当一面的大将了。
下一篇: Asp.net url分页的用户控件