我看了一下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,如需转载请自行联系原作者

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

  1. 【分布计算环境学习笔记】9 Web Service

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.概述: 在现有的各种异构平台的基础上,构筑一个通用的,与应用无关.语言无关的技术层,各种不同平台之上的应用依 ...

  2. Android学习笔记:Android基础知识点(不断更新中)

    1.Android学习笔记:OkHttp 2.Android学习笔记:更新UI的方法(UI线程和非UI线程) 3.Android学习笔记:Volley 4.Android学习笔记:Handler 5. ...

  3. MyGeneration学习笔记(10) :配置数据库连接

    在我的<MyGeneration学习笔记(1) : 使用MyGeneration生成存储过程和数据访问层代码 >一文中,我提到用internal string _raw = Project ...

  4. PHP学习笔记-PHP与Web页面的交互2

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/51761308 本文出自:[顾林海的博客] 前言 在<PHP学习笔 ...

  5. Tomcat学习笔记01【Web相关概念、Tomcat基本操作】

    Java后端 学习路线 笔记汇总表[黑马程序员] Tomcat学习笔记01[Web相关概念.Tomcat基本操作][day01] Tomcat学习笔记02[Tomcat部署项目][day01] 目录 ...

  6. Web Components 学习笔记一: Web Components是什么?解决了什么问题?

    公众号:妙蛙种子前端 文章原文地址:Web Components笔记一: Web Components是什么?解决了什么问题? | 妙蛙种子 - 记录WEB前端技术学习成长过程的博客 Web Comp ...

  7. 「学习笔记」移动Web开发之flex布局9

    「学习笔记」移动Web开发之flex布局9 一.flex布局体验 1.1 传统布局与flex布局 1.2 初体验 二.flex布局原理 2.1 布局原理 三.flex布局父项常见属性 3.1 常见父项 ...

  8. 「学习笔记」移动Web开发之rem适配布局10

    「学习笔记」移动Web开发之rem适配布局10 一.rem单位 1.1 rem 单位 二.媒体查询 2.1 什么是媒体查询 2.2 语法规范 2.2.1 mediatype 查询类型 2.2.2 关键 ...

  9. oracle修改asm参数文件,学习笔记:Oracle RAC参数文件管理 修改创建asm中的spfile文件...

    天萃荷净 Oracle rac创建修改asm中的spfile文件内容 create spfile to asm --查看sid SQL> show parameter instance_name ...

  10. 用JQuery中的Ajax方法获取web service等后台程序中的方法

    用JQuery中的Ajax方法获取web service等后台程序中的方法 1.准备需要被前台html页面调用的web Service,这里我们就用ws来代替了,代码如下: using System; ...

最新文章

  1. 某网络专业人士笔记(超级珍藏)
  2. ASP.NET MVC Routing、Areas、URLs
  3. ubuntu 13.04 设置Dash中显示Eclipse
  4. javascript要点
  5. 雇用Java EE开发人员的一些面试问题
  6. 微型计算机和pc的概念,微型计算机IBM-PC(0520)系统原理及应用
  7. Springboot 2.0选择HikariCP作为默认数据库连接池的五大理由
  8. sigprocmask, sigpending, sigsuspend的用法
  9. Java笔记(三)内部类,容器,泛型和类型安全的容器,迭代器
  10. wps office oa控件 痕迹_WPS加载项案例应用回顾
  11. 文件上传限制文件类型
  12. jquery复选框checkbox实现删除
  13. JS实现文字截取(雾)
  14. Gson解析数组和list容器
  15. 使用AJAX时出现“Microsoft JScript 运行时错误: 'Sys' 未定义”提示的解决方法
  16. scrapy_redis爬取统计局的城乡代码,以目录文件夹形式生成,同时最后保存在excel和redis数据库中
  17. transCAD求解两路径问题中遇到的问题和解决方法
  18. 计算机网络面试需要掌握的知识点汇总
  19. python ctype_Python中用ctype库
  20. 中断驱动的自行车码表

热门文章

  1. java 跳跃表_c++实现跳跃表(Skip List)的方法示例
  2. 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur (SCC缩点,SPFA最长路,枚举反边)
  3. 30-- A 代码记录分析
  4. 示范对外接口参数文档
  5. C#将运算字符串直接转换成表达式且计算结果
  6. /etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc(转载)
  7. 【Vegas原创】分别用Toad、EM解表锁
  8. QT的事件分发、事件过滤器详解
  9. C# 通过socket实现UDP 通信
  10. IOS的OC项目下回调函数的定义以及传参