日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MyGeneration学习笔记(5) :在Web Service中使用dOOdad(中) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ?我看了一下dOOdad的源碼和生成的代碼,發(fā)現(xiàn)實體類中有提供ToXml和FromXml方法,實現(xiàn)了字符串到Datatable的轉(zhuǎn)換,于是決定試下用字符串來保存DataTable信息,然后再在網(wǎng)絡(luò)中傳輸字符串,這就是我的原始思想。

??? ??在Web Service中使用dOOdad(上),將FromDataSet/ToDataSet改成FromXml/ToXml,返回值/參數(shù)改成string,即可實現(xiàn)以字符串作為返回值,下面以插入一條記錄為例:

[WebMethod]?
public?bool?Insert(string?str)?
{?
??????
bool?wasSaved?=?false;?
??????
try?
??????
{?
?????????Employees?emps?
=?new?Employees();?
?????????emps.FromXml(str);?
?????????emps.Save();?
?????????wasSaved?
=?true;?
??????}
?
??????
catch?{?}?
??????
return?wasSaved;?
}
?

??????? 但這樣又引發(fā)了新的問題:ToXml后的字符串丟失了DataTable中的部分重要信息,如DataSet的Schema、DataRow的狀態(tài)(Added/Modified/Deleted)、沒有賦值的屬性等。所以在服務(wù)器端從字符串中取得數(shù)據(jù)Load進(jìn)業(yè)務(wù)實體后,還得一些額外的操作,于是我嘗試了下面兩種方法,且都可以通過測試:?

?

方法1 :new一個新業(yè)務(wù)實體,將數(shù)據(jù)拷貝到新實體中:

Web服務(wù)端代碼:

[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;
}

調(diào)用WebService的客戶端代碼:

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

?????? 這種方法也不是很好,服務(wù)器端要從字符串中解析出數(shù)據(jù)并new一個新對象,再將數(shù)據(jù)拷貝到新對象中。麻煩,不爽。于是,我又嘗試了下面的方法。

?

方法2 :為業(yè)務(wù)實體找回丟失的部分重要信息

????????? 講解這種方法之前,先解釋一下emps.Save的原理,該Method內(nèi)部,判斷DataRow的狀態(tài)(Added、Modified、Deleted)并根據(jù)狀態(tài)執(zhí)行相應(yīng)的插入/更新/刪除操作。
????????? 事實上,執(zhí)行emps.FromXml之后,DataRow的狀態(tài)為Added(可以用RowState()進(jìn)行測試),所以理論上是可以執(zhí)行Save()來直接進(jìn)行插入操作,而不用new一個新對象;然而如方法1中所說,emps.ToXml獲得的字符串丟失了部分信息--emps對象的那些沒有賦值的屬性都丟失了,所以像ID這種在客戶端沒有賦值的屬性,在xml中也沒有它相應(yīng)的標(biāo)簽(<tag>).
????????? 客戶端將業(yè)務(wù)實體Toxml轉(zhuǎn)換成string,傳給服務(wù)器端,服務(wù)器端的代碼:

[WebMethod]
public?Insert(string?str)
{
??
//客戶端沒有對ID進(jìn)行賦值
??Employee?emps?=?new?Employee();
??emps.FromXml(str);
??
//在這里訪問emps.ID會出錯:ID不是School中的列。
??emps.Save();//出錯(同上)。
}

???????? 出現(xiàn)上述注釋中的問題的原因是ID列的信息丟失了,這時我們可以手動添加ID列,示例代碼如下:

[WebMethod]
public?Insert(string?str)
{
?????????Emplyee?emps?
=?new?Employee()
??????????emps.AddColumn(
"ID",typeof(int));
??????????emps.AddColumn……
//其他沒有賦值的屬性
??????????emps.Save();?//終于可以成功地寫入數(shù)據(jù)庫了^_^
}

??????? 客戶端代碼同法1中一樣,不再贅述。

??????? 最后再補充一點:因為AddNew()方法是從數(shù)據(jù)庫中檢索架構(gòu)的,而在調(diào)用WebService的客戶端,是不能通過這種方式來創(chuàng)建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();
}


本文轉(zhuǎn)自Silent Void博客園博客,原文鏈接:http://www.cnblogs.com/happyhippy/archive/2006/08/23/601237.html,如需轉(zhuǎn)載請自行聯(lián)系原作者

總結(jié)

以上是生活随笔為你收集整理的MyGeneration学习笔记(5) :在Web Service中使用dOOdad(中)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。