现在做一个项目,在数据库和表名以及列名都不确定的情况下,返回查询的数据集。这在ASP.NET或者C/S模式很容易实现。但是在现有的SL+WCF技术下是不能实现的,首先返回值就不好确定,WCF的返回值类型必须是确定的。比较返回值为Object类型就不可以。而且返回DataTable和DataSet又不可以。在客户接收不到数据,返回的数据类型为Object。那么我们可以通过普通的方式取得数据集,然后把数据集转换为XML格式的字符串,然后在客户端把字符串解析为类型DataSet数据集。
其实把DataSet数据集转化为XML格式的字符串以及把XML格式的字符串解析为DataSet数据集的工作,已经有加拿大的同行把业务逻辑封装好了,我们只要调用其中的方法就可以了,你也可以反编译看看老外的代码,老外的原文地址:http://silverlightdataset.net/silverlightdataset/Default.aspx,其中用到的组件为Silverlight.DataSetConnector.dll(服务端使用)和Silverlight.DataSet.dll(用于客户端)
我们使用原生态的ADO.NET进行数据访问,你也可以替代成你自己的数据Provider.
1: [EnableClientAccess()]
2: public class CustomerDomainService : DomainService
3: {
4: public List<Item> GetItemsFromDatabase()
5: {
6: sqlConnection sqlConnection = new sqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MainDb"].ToString());
7: DataSet objSet = new DataSet();
8: sqlCommand sqlCommand = new sqlCommand();
9: sqlCommand.Connection = sqlConnection;
10: sqlCommand.CommandText = "Select * FROM tblItem";
11: sqlDataAdapter sqlDataAdapter = new sqlDataAdapter();
12: sqlDataAdapter.SelectCommand = sqlCommand;
13: sqlDataAdapter.Fill(objSet);
14:
15: List<Item> lstResult = new List<Item>();
16: Item objEmployee;
17:
18: if (objSet.Tables.Count > 0)
19: {
20: foreach (DaTarow dr in objSet.Tables[0].Rows)
21: {
22: objEmployee = new Item();
23: objEmployee.Quantity = Convert.ToInt32(dr["Quantity"]);
24: objEmployee.ItemDescription = dr["ItemDescription"].ToString();
25: objEmployee.ItemNumber = Convert.ToInt32(dr["ItemNumber"]);
26: lstResult.Add(objEmployee);
27: }
28: }
29: return lstResult;
30: }
31: }
但是SL的DataGrid不接受DATASET或者DataTable类型的数据源的,他接受的是实休集合。所以我们就需要扩展SL的DataGrid,使其变为像ASP.NET中的DataView那样,有DataSource属性,有DataBind方法。这个有源代码可以下载,你可以根据自己的需要再来扩展。下载地址为:http://slbindabledatagrid.codeplex.com/,其实这个方法的核心还是要把数据集转化为List类型的集合,然后这个结果再赋值给DataGrid
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。