ASP.NET 2.0的DataTable小兵变大将
我们先看一段web service的代码。
[webmethod]
public datatable 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, "customers");
return custds.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 返回值会报以下异常:
类型 system.componentmodel.isite 的成员 system.componentmodel.marshalbyvaluecomponent.site 是接口,因此无法将其序列化。
在.net 2.0 中,以上同样的代码,则没有任何问题了。原因是2.0中 datatable实现了序列化、反序列。
在vs2005 beta2 的文档中,我们可以看到2.0 中 datatable实现了以下接口:
explicit interface implementations
system.componentmodel.ilistsource.get_containslistcollection
system.componentmodel.ilistsource.getlist
system.xml.serialization.ixmlserializable.getschema
system.xml.serialization.ixmlserializable.readxml
system.xml.serialization.ixmlserializable.writexml
而在1.1中,datatable 只实现了一个接口:
explicit interface implementations
system.componentmodel.ilistsource.containslistcollection
把dataset中的一些功能移到 datatable中,2.0 中还有 merge 方法,即合并数个数据集。
datatable的代码合并参看下面代码。
private static void demonstratemergetable()
...{
datatable table1 = new datatable("items");
datacolumn column1 = 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[] ...{ column1 };
table1.rowchanged += new system.data.datarowchangeeventhandler(row_changed);
datarow row;
for (int i = 0; i <= 3; i++)
...{
row = table1.newrow();
row["id"] = i;
row["item"] = i;
table1.rows.add(row);
}
// accept changes. (来源www.iocblog.net)
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);
// merge table2 into the table1.
table1.merge(table2);
}
综合上述,.net 2.0 中 datatable 从后台的默默无问的小兵变成独当一面的大将了。(来源www.iocblog.net)
Tag: DataTable
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。