Silverlight实例教程7:Silverlight传递DataTable解决方案(2)
MetaData.cs 元数据定义 Code /// summary /// 元数据信息 /// /summary [DataContract] public class MetaData : XCenter.Framework.Public.Core.ICloneable { #region prop //字段列表 private List
MetaData.cs 元数据定义
Code
/// <summary>
/// 元数据信息
/// </summary>
[DataContract]
public class MetaData : XCenter.Framework.Public.Core.ICloneable
{
#region prop //字段列表
private List<Field> fieldsList = new List<Field>();
//名称-字段缓存
private Dictionary<string, Field> fieldCache = null;
private bool specialChar = false;
private object lockObject = new object(); /// <summary>
/// 字段列表
/// </summary>
[DataMember]
public List<Field> Fields
{
get { return fieldsList; }
set { fieldsList = value; }
} ..
DataSetData.cs 数据集定义
Code
/// <summary>
/// 数据集用于前后台传递数据
/// </summary>
[DataContract]
public class DataSetData : XCenter.Framework.Public.Core.ICloneable
{
#region prop private MetaData md;
private List<List<object>> datas = new List<List<object>>(); /// <summary>
/// 元数据信息
/// </summary>
[DataMember]
public MetaData MetaData
{
get { return md; }
set { md = value; }
}
Field对应于DataTable中的列信息。MetaData主要就是对Field进行封装,并实现一些公共的操作方法。DataSetData封装了MetaData并用List<List<object>>存放具体数据。
这里要说明一下,由于从DataTable取出的实际数据都是基本类型(int,string,byte[]...)等WCF中可以直接传递的数据。所以这里用List<List<object>>传递数据不会有问题。如果List中有用户定义类型,不在ServiceKnownType中事先声明,那么Silverlight端反序列化时会报错。
以IQEObjectStorage这个WCF服务接口的GetData方法可以看出具体的WCF声明:
[OperationContract]
DSDReturnDataVO GetData(QueryBaseVO qbd, ServiceContext context);
这里的DSDReturnDataVO只是XCenter中为所有能返回DataSetData的服务定义的统一的返回值。读者可以直接返回DataSetData。这个服务其实就是手工Sql设计的取数方法。其内部处理逻辑是将查询模型解析成Sql送到数据库执行并取得DataTable组装DataSetData。这里的具体逻辑我们暂时不关心。
下面看看SL端对传来的DataSetData的处理过程。我们可以看QueryMain.xaml.cs的service_GetDataCompleted方法,这个方法最初是由工具栏中的运行查询按钮触发。
Code
/// <summary>
/// 元数据信息
/// </summary>
[DataContract]
public class MetaData : XCenter.Framework.Public.Core.ICloneable
{
#region prop //字段列表
private List<Field> fieldsList = new List<Field>();
//名称-字段缓存
private Dictionary<string, Field> fieldCache = null;
private bool specialChar = false;
private object lockObject = new object(); /// <summary>
/// 字段列表
/// </summary>
[DataMember]
public List<Field> Fields
{
get { return fieldsList; }
set { fieldsList = value; }
} ..
DataSetData.cs 数据集定义
Code
/// <summary>
/// 数据集用于前后台传递数据
/// </summary>
[DataContract]
public class DataSetData : XCenter.Framework.Public.Core.ICloneable
{
#region prop private MetaData md;
private List<List<object>> datas = new List<List<object>>(); /// <summary>
/// 元数据信息
/// </summary>
[DataMember]
public MetaData MetaData
{
get { return md; }
set { md = value; }
}
Field对应于DataTable中的列信息。MetaData主要就是对Field进行封装,并实现一些公共的操作方法。DataSetData封装了MetaData并用List<List<object>>存放具体数据。
这里要说明一下,由于从DataTable取出的实际数据都是基本类型(int,string,byte[]...)等WCF中可以直接传递的数据。所以这里用List<List<object>>传递数据不会有问题。如果List中有用户定义类型,不在ServiceKnownType中事先声明,那么Silverlight端反序列化时会报错。
以IQEObjectStorage这个WCF服务接口的GetData方法可以看出具体的WCF声明:
[OperationContract]
DSDReturnDataVO GetData(QueryBaseVO qbd, ServiceContext context);
这里的DSDReturnDataVO只是XCenter中为所有能返回DataSetData的服务定义的统一的返回值。读者可以直接返回DataSetData。这个服务其实就是手工Sql设计的取数方法。其内部处理逻辑是将查询模型解析成Sql送到数据库执行并取得DataTable组装DataSetData。这里的具体逻辑我们暂时不关心。
下面看看SL端对传来的DataSetData的处理过程。我们可以看QueryMain.xaml.cs的service_GetDataCompleted方法,这个方法最初是由工具栏中的运行查询按钮触发。
精彩图集
精彩文章