我看了一下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();
}

浙公網安備 33010602011771號