Silverlight 3 调用WCF/webService 获得“DataSet”
之前写过一篇文章,为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;
}
}
{
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);
}
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如果自定义还不得而知。给我们在解析时徒增困惑。