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

 

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如果自定义还不得而知。给我们在解析时徒增困惑。

 

posted on 2010-01-16 17:00  easy2Dev  阅读(1934)  评论(0编辑  收藏  举报

导航