happyhippy

这个世界的问题在于聪明人充满疑惑,而傻子们坚信不疑。--罗素


      dOOdad对Web Service的支持还不够好,dOOdad的核心是DataTable,而在ADO.Net 2.0中的DataTable虽然相对1.x功能扩展了不少,微软鼓吹DataTable功能有多强多强,据说Web Service也都支持返回DataTable,但俺试了一下,发现还存在不少问题。
    既然Web service不支持DataTable作返回值,所以要将业务实体类内部的信息在网络中传输,就得想其他办法。

       下面是MyGeneration论坛上某网友提供的一种解决方法,基本思路是将dOOdad业务实体内中的DataTable封装到DataSet,将dataset做为参数或返回值:

//Concrete class中添加如下两个方法:

public class Employees : _Employees 

   
public void FromDataSet(DataSet ds) 
   

      
this.DataTable = ds.Tables[0]; 
   }
 

   
public DataSet ToDataSet() 
   

      DataSet dataSet 
= new DataSet(); 
      dataSet.Tables.Add(
this.DataTable); 
      
return dataSet; 
   }
 
}

Web Service中的代码片断:

[WebMethod] 
public DataSet LoadAll() 

      
try 
      

         Employees emps 
= new Employees(); 
         emps.LoadAll(); 
         
return emps.ToDataSet(); 
      }
 
      
catch return null; } 
}
 

[WebMethod] 
public bool Save(DataSet dataset) 

      
bool wasSaved = false
      
try 
      

         Employees emps 
= new Employees(); 
         emps.FromDataSet(dataset); 
         emps.Save(); 
         wasSaved 
= true
      }
 
      
catch { } 
      
return wasSaved; 
}
 

客户端代码:

//---------------------------------------------------------- 
// Invoke the Web Service and Load all of the Data 
//---------------------------------------------------------- 
EmployeesService empsService = new EmployeesService(); 
DataSet ds 
= empsService.LoadAll(); 

//---------------------------------------------------------- 
// Load that Data into a local Employees object 
//---------------------------------------------------------- 
Employees emps = new Employees(); 
emps.FromDataSet(ds); 
emps.FirstName 
= "WebService!!"
emps.GetChanges();  
// very important 

//---------------------------------------------------------- 
// Reconvert to a DataSet (after calling GetChanges) 
//---------------------------------------------------------- 
ds = emps.ToDataSet(); 

//---------------------------------------------------------- 
// Marshall it back to the web service 
//---------------------------------------------------------- 
empsService.Save(ds);

          这个方法不错,不过有个小问题就是这个DataSet有自己的Schema,如果客户端对该web服务接口的访问量比较大的话,给网络传输带来一定的性能影响。 

         下一篇文章中,我将给出我自己的一个另一种实现方法,敬请关注。


posted on 2006-08-23 05:33  Silent Void  阅读(978)  评论(7编辑  收藏  举报