Sql server 在C#中提取DataTable列的子集,然后将它们作为JSON字符串发送到浏览器客户端
下面是一个场景:C#中间层webservice将从SQL Server发送的数据放在System.data.DataTable对象中。DataTable的columns集合中有几十列。浏览器客户端只需要看到其中的六个。服务器上存储的进程是通用的,不是为这个特定任务设计的。假设我们必须使用它,而不是编写新的SP 是否有一种简单的方法(可能使用泛型)将所需的列子集从该数据表提取到列表或集合中,然后使用JSON.NET将结果列表或集合转换为JSON 是否可以使用相关字段名(和数据类型)创建一个骨架C类定义Sql server 在C#中提取DataTable列的子集,然后将它们作为JSON字符串发送到浏览器客户端,sql-server,json,c#-4.0,datetime,system.data.datatable,Sql Server,Json,C# 4.0,Datetime,System.data.datatable,下面是一个场景:C#中间层webservice将从SQL Server发送的数据放在System.data.DataTable对象中。DataTable的columns集合中有几十列。浏览器客户端只需要看到其中的六个。服务器上存储的进程是通用的,不是为这个特定任务设计的。假设我们必须使用它,而不是编写新的SP 是否有一种简单的方法(可能使用泛型)将所需的列子集从该数据表提取到列表或集合中,然后使用JSON.NET将结果列表或集合转换为JSON 是否可以使用相关字段名(和数据类型)创建一个骨架C类
foo
,然后“自动”匹配这些字段名,从而从数据表的行集合生成一个列表
理想情况下,在JSON转换过程中,任何SQL Server日期时间值(例如,
2014-06-24T18:45:00
)都将转换为一个值,该值可以轻松地在客户端中实例化javascript日期,而无需对日期表示进行字符串操作。下面粘贴了完整的工作控制台应用程序代码。但您需要的两种主要方法如下
要使此代码正常工作,您必须在项目中执行以下操作
JSON.Net
Nuget包添加到项目中System.Web.Extensions
的引用(如果在GetJson
方法中引用System.Web.Script.Serialization.JavaScriptSerializer
的行中出现编译错误)
/// <summary>
/// Returns Json representation of Generic class with only matching properties from the DataTable (passed as parameter)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt"></param>
/// <returns></returns>
public static string GetJsonFromDataTable<T>(DataTable dt) where T : new()
{
string json = GetJson(dt);
return JsonConvert.SerializeObject(JsonConvert.DeserializeObject<List<T>>(json));
}
/// <summary>
/// Returns a JSON string for entire DataTable (passed as parameter)
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string GetJson(DataTable dt)
{
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Dictionary<string, object>> rows = (from DataRow dr in dt.Rows select dt.Columns.Cast<DataColumn>().ToDictionary(col => col.ColumnName.Trim(), col => dr[col])).ToList();
return serializer.Serialize(rows);
}
代码说明:
注意,我有两个类,Patient
和PatientDrug
。
我编写了helper方法来返回两个类的数据表,这两个类都有额外的列。
然后,下面两行分别为Patient
和PatientDrug
获取类表示的JSON,同时忽略DataTable中与名称不匹配的其他数据列
string patientDrugJson = GetJsonFromDataTable<PatientDrug>(patientDrugDataTable);
string patientJson = GetJsonFromDataTable<Patient>(patientDataTable);
string patientDrugJson=GetJsonFromDataTable(patientDrugDataTable);
字符串patientJson=GetJsonFromDataTable(patientDataTable);
控制台窗口中的输出(json字符串)
非常感谢这个工作示例。在我正式接受答案之前,我必须先研究代码——您使用一些我不熟悉的C#技能:-)
string patientDrugJson = GetJsonFromDataTable<PatientDrug>(patientDrugDataTable);
string patientJson = GetJsonFromDataTable<Patient>(patientDataTable);