MyGeneration学习笔记(5) :在Web Service中使用dOOdad(中)

简介:

   我看了一下dOOdad的源码和生成的代码,发现实体类中有提供ToXml和FromXml方法,实现了字符串到Datatable的转换,于是决定试下用字符串来保存DataTable信息,然后再在网络中传输字符串,这就是我的原始思想。

      在Web Service中使用dOOdad(上),将FromDataSet/ToDataSet改成FromXml/ToXml,返回值/参数改成string,即可实现以字符串作为返回值,下面以插入一条记录为例:

[WebMethod] 
public   bool  Insert( string  str) 

      
bool wasSaved = false
      
try 
      

         Employees emps 
= new Employees(); 
         emps.FromXml(str); 
         emps.Save(); 
         wasSaved 
= true
      }
 
      
catch { } 
      
return wasSaved; 
}
 

        但这样又引发了新的问题:ToXml后的字符串丢失了DataTable中的部分重要信息,如DataSet的Schema、DataRow的状态(Added/Modified/Deleted)、没有赋值的属性等。所以在服务器端从字符串中取得数据Load进业务实体后,还得一些额外的操作,于是我尝试了下面两种方法,且都可以通过测试: 

 

方法1 :new一个新业务实体,将数据拷贝到新实体中

Web服务端代码:

[WebMethod]
public   bool  Insert( string  str)
{
  Employee emps 
= new Employee();
  emps.FromXml(str);
  Employee temp 
= new Employee();
  temp.AddNew();
  temps.FirstName 
= emps.FirstName;
  temps.LastName 
= emps.LastName;
  ……   
//其他字段的赋值
  temp.Save();
  
int id = temp.ID;
}

调用WebService的客户端代码:

Employee emps  =   new  Employee();
emps.FristName 
=   " Happy " ;
  temps.LastName 
=   " Hippy " ;
…… 
// 其他字段的赋值
Serivce1 webservice  =   new  Service1();
webservice.Insert(emps.Toxml());

       这种方法也不是很好,服务器端要从字符串中解析出数据并new一个新对象,再将数据拷贝到新对象中。麻烦,不爽。于是,我又尝试了下面的方法。

 

方法2 :为业务实体找回丢失的部分重要信息

          讲解这种方法之前,先解释一下emps.Save的原理,该Method内部,判断DataRow的状态(Added、Modified、Deleted)并根据状态执行相应的插入/更新/删除操作。
          事实上,执行emps.FromXml之后,DataRow的状态为Added(可以用RowState()进行测试),所以理论上是可以执行Save()来直接进行插入操作,而不用new一个新对象;然而如方法1中所说,emps.ToXml获得的字符串丢失了部分信息--emps对象的那些没有赋值的属性都丢失了,所以像ID这种在客户端没有赋值的属性,在xml中也没有它相应的标签(<tag>).
          客户端将业务实体Toxml转换成string,传给服务器端,服务器端的代码:

[WebMethod]
public  Insert( string  str)
{
  
//客户端没有对ID进行赋值
  Employee emps = new Employee();
  emps.FromXml(str);
  
//在这里访问emps.ID会出错:ID不是School中的列。
  emps.Save();//出错(同上)。
}

         出现上述注释中的问题的原因是ID列的信息丢失了,这时我们可以手动添加ID列,示例代码如下:

[WebMethod]
public  Insert( string  str)
{
         Emplyee emps 
= new Employee()
          emps.AddColumn(
"ID",typeof(int));
          emps.AddColumn……
//其他没有赋值的属性
          emps.Save(); //终于可以成功地写入数据库了^_^
}

        客户端代码同法1中一样,不再赘述。

        最后再补充一点:因为AddNew()方法是从数据库中检索架构的,而在调用WebService的客户端,是不能通过这种方式来创建DataTable的,所以要在ConcreteClass中加一个方法来重写AddNew()方法:

public   override   void  AddNew()
{
      
this.DataTable = new DataTable();
      
this.AddColumn(Employee.ColumnNames.ID, typeof(int));
      
this.AddColumn(Employee.ColumnName.FirstName,typeof(string));
      ………………
      
base.AddNew();
}


本文转自Silent Void博客园博客,原文链接:http://www.cnblogs.com/happyhippy/archive/2006/08/23/601237.html,如需转载请自行联系原作者

相关文章
|
5月前
|
Java Docker 容器
美团大牛精心整理SpringBoot学习笔记,从Web入门到系统架构
近期慢慢复工,为了准备面试,各路码友们都开始磨拳擦脚,背面试题、知识点。小编最近得一良友赠送了一份关于SpringBoot的学习笔记,简直不要好用,理论解析言简意赅,每一步操作都有图片展示。这么好的东西肯定不能私藏,为了感谢大家在2019年里的支持,我现在将这份笔记赠送给大家,祝大家前程似锦,Offer不断!
|
2月前
|
存储 缓存 算法
关于 Service Worker 和 Web 应用对应关系的讨论
关于 Service Worker 和 Web 应用对应关系的讨论
16 0
|
3月前
|
Java API Apache
Apache CXF生成WebService的客户端
Apache CXF生成WebService的客户端
|
7月前
|
JSON 安全 API
使用 ABAP sproxy 事务码生成的 Proxy 消费 Web Service
使用 ABAP sproxy 事务码生成的 Proxy 消费 Web Service
59 0
|
3月前
|
XML 网络架构 数据格式
Ruby 教程 之 Ruby Web Service 应用 - SOAP4R 2
Ruby Web Service 应用 - SOAP4R
24 5
|
3月前
|
XML Linux 网络架构
Ruby 教程 之 Ruby Web Service 应用 - SOAP4R 1
Ruby Web Service 应用 - SOAP4R
23 3
|
5月前
|
Java 数据库连接 Apache
SpringBoot整合CXF实现WebService
SpringBoot整合CXF实现WebService
129 0
|
15天前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
4天前
|
关系型数据库 MySQL
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
|
1天前
|
安全 测试技术 PHP
掌握现代Web开发:PHP 8的新特性与最佳实践
【5月更文挑战第5天】 在当今快速发展的网络世界中,PHP作为一种流行的服务器端脚本语言,持续地演化着。最新的PHP 8版本引入了一系列令人兴奋的新特性和性能改进,为开发者提供了更加强大和灵活的工具。本文将深入探讨PHP 8中的新特性,包括联合类型、名称参数、匹配表达式等,并分享一些最佳实践,帮助开发者提高代码质量,优化性能,并确保安全性。通过这些实用技巧和示例,您将能够构建更高效、更安全的PHP应用程序。