ASP.NET 2.0的DataTable小兵变大将

分类: asp.net技巧   出处:iocblog整理  更新时间:2009-11-19   添加到收藏  

  我们先看一段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
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。