MyGeneration学习笔记(5) :在Web Service中使用dOOdad(中)
2007-01-28 11:18
525 查看
我看了一下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();
}
在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();
}
相关文章推荐
- MyGeneration学习笔记(5) :在Web Service中使用dOOdad(中)
- MyGeneration学习笔记(5) :在Web Service中使用dOOdad(中)
- Web Service学习笔记:什么时候应该使用Web Service
- MyGeneration学习笔记(8) :dOOdad提供的数据绑定、特殊函数和事务处理
- MyGeneration学习笔记(8) :dOOdad提供的数据绑定、特殊函数和事务处理
- Web Service学习笔记:天气预报Web服务的使用方法
- MyGeneration学习笔记(8) :dOOdad提供的数据绑定、特殊函数和事务处理
- MyGeneration学习笔记(8) :dOOdad提供的数据绑定、特殊函数和事务处理
- FastSpring学习笔记二(使用工具MyGeneration生成Model和NHibernate的代码 )
- FastSpring学习笔记二(使用工具MyGeneration生成Model和NHibernate的代码 )
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
- Linux学习笔记之——普通用户使用sudo命令
- [Java Path Finder][JPF学习笔记][3]使用jpf-shell
- [javase学习笔记]-7.12 static关键字的使用场景
- NDK学习笔记:动态链接库与静态链接库的基本使用流程简记
- 【C#学习笔记】LinkedList容器使用
- C++学习笔记(第11章->使用类)
- python2.7爬虫学习笔记(一)---Urllib库的使用
- Linux学习笔记之——su、sudo命令使用及区别
- SpringMVC注记方式验证学习笔记——在注记消息中使用注记参数