网站首页 > 网络编程教程 > ASP.NET教程 > ASP.NET 2.0中DataTable小兵变大将

ASP.NET 2.0中DataTable小兵变大将

  • 作者:互联网
  • 时间:2009-06-30 15:38:23

作者: 蝈蝈俊 出处: 博客堂

  我们先看一段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 从后台的默默无问的小兵变成独当一面的大将了。