为Silverlight 项目创建通用WebService数据访问
2009-03-15 21:51
519 查看
在使用Silverlight之前,我们创建了自己的webService做为通用数据访问。开发者传递一个Sql语句,即可得到一个DataSet,DataTable作为返回值。在Silverlight项目中,由于其对DataTable的限制,我们不得不首先得到DataTable,而后在本地再创建Web service(WCF),对得到的DataTable进行转换。转换为数组或者泛型集合以适应Silverlight的需要。
但是这样做难免有些繁琐,且开发者做出了很多费力的工作。
这里,我们对原来的Webservice做出了一些改动:但凡返回值为DataSet的webMethod都为其加上一层“外衣”,将其转化为XElement后返回给调用者一个XML档案。开发者只需利用LINQ TO Xml通过简单的xml操作就可得到需要的集合。这样就免除了每个专案建立“自己”的service的工作。
下面通过一个简单的Demo对这个操作做出说明:
根据得到的DataTable,为其创建XElement作为返回值
Code
static void Main(string[] args)
{
//获取数据源DataTable
DataTable dt = client.ExecuteQuery(sql).Tables[0];
//创建Xml Document
XDocument doc= new XDocument(
new XElement("tables",
new XAttribute("xmlns", ""),
new XElement("table",
new XAttribute("name", "0"),
new XElement("columns"),
new XElement("rows")))
);
XElement columns = doc.Element("tables").Element("table").Element("columns");
foreach (DataColumn col in dt.Columns)
{
//新增一个Element Column
columns.Add(new XElement("column",
new XAttribute("name", col.ColumnName),
new XAttribute("type", col.DataType.Name)
));
}
XElement rows = doc.Element("tables").Element("table").Element("rows");
foreach (DataRow row in dt.Rows)
{
//新增一个element Row
XElement newrow = new XElement("row");
rows.Add(newrow);
string data = null;
foreach (DataColumn col in dt.Columns)
{
switch (col.DataType.Name)
{
case "DateTime":
data = (row[col] == DBNull.Value ? "" : Convert.ToDateTime(row[col]).ToString("yyyy/MM/dd HH:mm:ss"));
break;
default:
data = (row[col] == DBNull.Value ? "" : row[col].ToString());
break;
}
//为新增的row添加Attribute
newrow.Add(new XAttribute(col.ColumnName, data)
);
}
}
XElement element = doc.Element("tables");
Console.WriteLine(element.ToString());
}
Result:
调用者解析xelement
Code
public static List<BasicInfo> getBasicInfo(XElement element)
{
List<BasicInfo> Lists = new List<BasicInfo>();
//element为获得的返回者
var result = from item in element.Descendants("row")
select item;
BasicInfo info = null;
foreach (XElement item in result)
{
info = new BasicInfo();
info.ID = (int)item.Attribute("ID");
info.Name = (string)item.Attribute("NAME");
info.ParentID = (int)item.Attribute("PARENTID");
info.Grade = (int)item.Attribute("GRADE");
info.IDX = (int)item.Attribute("IDX");
Lists.Add(info);
}
return Lists;
}
注:这里的实体类是不能缺少的
Code
public class BasicInfo
{
public int ID { set; get; }
public string Name { set; get; }
public int ParentID { set; get; }
public int Grade { set; get; }
public int IDX { set; get; }
}
这里LINQ To XML的应用使得操作变得简单实用.
但是这样做难免有些繁琐,且开发者做出了很多费力的工作。
这里,我们对原来的Webservice做出了一些改动:但凡返回值为DataSet的webMethod都为其加上一层“外衣”,将其转化为XElement后返回给调用者一个XML档案。开发者只需利用LINQ TO Xml通过简单的xml操作就可得到需要的集合。这样就免除了每个专案建立“自己”的service的工作。
下面通过一个简单的Demo对这个操作做出说明:
根据得到的DataTable,为其创建XElement作为返回值
Code
static void Main(string[] args)
{
//获取数据源DataTable
DataTable dt = client.ExecuteQuery(sql).Tables[0];
//创建Xml Document
XDocument doc= new XDocument(
new XElement("tables",
new XAttribute("xmlns", ""),
new XElement("table",
new XAttribute("name", "0"),
new XElement("columns"),
new XElement("rows")))
);
XElement columns = doc.Element("tables").Element("table").Element("columns");
foreach (DataColumn col in dt.Columns)
{
//新增一个Element Column
columns.Add(new XElement("column",
new XAttribute("name", col.ColumnName),
new XAttribute("type", col.DataType.Name)
));
}
XElement rows = doc.Element("tables").Element("table").Element("rows");
foreach (DataRow row in dt.Rows)
{
//新增一个element Row
XElement newrow = new XElement("row");
rows.Add(newrow);
string data = null;
foreach (DataColumn col in dt.Columns)
{
switch (col.DataType.Name)
{
case "DateTime":
data = (row[col] == DBNull.Value ? "" : Convert.ToDateTime(row[col]).ToString("yyyy/MM/dd HH:mm:ss"));
break;
default:
data = (row[col] == DBNull.Value ? "" : row[col].ToString());
break;
}
//为新增的row添加Attribute
newrow.Add(new XAttribute(col.ColumnName, data)
);
}
}
XElement element = doc.Element("tables");
Console.WriteLine(element.ToString());
}
Result:
调用者解析xelement
Code
public static List<BasicInfo> getBasicInfo(XElement element)
{
List<BasicInfo> Lists = new List<BasicInfo>();
//element为获得的返回者
var result = from item in element.Descendants("row")
select item;
BasicInfo info = null;
foreach (XElement item in result)
{
info = new BasicInfo();
info.ID = (int)item.Attribute("ID");
info.Name = (string)item.Attribute("NAME");
info.ParentID = (int)item.Attribute("PARENTID");
info.Grade = (int)item.Attribute("GRADE");
info.IDX = (int)item.Attribute("IDX");
Lists.Add(info);
}
return Lists;
}
注:这里的实体类是不能缺少的
Code
public class BasicInfo
{
public int ID { set; get; }
public string Name { set; get; }
public int ParentID { set; get; }
public int Grade { set; get; }
public int IDX { set; get; }
}
这里LINQ To XML的应用使得操作变得简单实用.
相关文章推荐
- 为Silverlight项目创建通用WebService数据访问
- 为Silverlight项目创建通用WebService数据访问
- 为Silverlight 项目创建通用WebService数据访问
- 创建 Silverlight 应用程序以访问 SharePoint 2010 数据
- django之创建第4-3个项目-访问list数据
- django之创建第4-1个项目-访问dict数据
- Silverlight 3中如何创建Linq to SQL项目实现MS-SQL数据的操作
- Silverlight项目发布无法访问WebService接口问题
- 创建 Silverlight 应用程序以访问 SharePoint 2010 数据
- 学习使用NHibernate2.1.0Beta1(四)— 创建数据访问项目DAL
- iOS 访问本地沙盒路径,创建文件夹,判断是否已创建再创建文件夹,写数据到创建目录
- Silverlight API的多源数据访问研究
- Android4大组件之ContentProvider跨项目访问数据Demo
- SqlServer,无法为该请求检索数据, 尝试打开或创建物理文件,CREATE FILE 遇到操作系统错误(拒绝访问)。
- Excel VBA 学习总结 - 通用ADO数据访问模型
- Spring mvc创建的web项目,如何获知和修改其web的项目访问链接名称?
- Flex与.NET互操作(三):基于WebService的数据访问(下)
- Silverlight学习笔记(一)-----Silverlight入门之创建项目与使用渐变填充色
- Silverlight 2 跨域访问控件与WebService的资料整理
- silverlight调用WebService传递json接收绑定数据