之前寫過一篇文章,為Silverlight 項目建立通用WebService資料訪問 ,寫的是如果在Silverlight中如果要使用Web Service,可以在Web Service中把大家常用的DataTable轉化為XElement返回,從而實現所謂的通用的資料訪問Service.
今天要說的是,如果我們在使用Silverlight3時使用WCF/web Service,可以定義DataSet作為傳回值,這樣在Silverlight Application 中調用此Service時,得到的傳回值就直接可以得到ArrayOfXElement(如果是DataTable則報錯)
看下面Demo.(以WCF為例)
WCF定義:
代碼
public DataSet ExecuteQuery(string SQL)
{
try
{
string[] temp = SQL.Split(";".ToCharArray());
DataSet ds = new DataSet();
for (int i = 0; i < temp.Length; i++)
{
SqlDataAdapter da = new SqlDataAdapter(temp[i], con);
da.Fill(ds, i.ToString());
}
return ds;
}
catch (Exception ex)
{
throw ex;
}
}
Silverlight中呼叫:
注意e.Result的類型,XElement類型,我們只要確認這個XElement的結構並正確Parse即可。
經過分析可知,每個Sql語句的執行結果,被解析為兩個Nodes.
我們現看看每個Node的內容:
Node0: sql語句中的資料結構
Node1:sql的執行結果,以xml格式返回
可以看到此結果就是一個Xml,只是它有自己的格式定義,下面我們解析這個xml就可以得到我們的結果。
代碼
var s = from item in result.Nodes[1].Descendants("_x0030_")
select new
{
guid = item.Element("guid").Value,
name = item.Element("name").Value,
address = item.Element("address").Value,
dept = item.Element("dept").Value,
};
foreach (var v in s)
{
MessageBox.Show(v.guid+"--"+v.name);
}
注意,這裡的“_x0030”在Node0中有定義。當然如果有多個sql,在Node0中就會有多個name的定義:如_x0030_, _x0031_.但是這個Name如果自訂還不得而知。給我們在解析時徒增困惑。