分享一个自己写的工具Sql2Json
前言
最近在维护一个公司之前自己开发的项目,项目使用的了WCF作为组件之间数据传输,可是在优化代码的过程当中发现了一些问题,最明显也最有必要修改的就是返回值是DataSet和DataTable的Function。
众所周知在WCF的Function中返回DataTable,DataSet对于性能有相当大的影响的,因为在Soap协议序列化为XML的时候会附加上很多的属性,记得一个最简单的说明是我们本想返回水果“Object”,但是DataSet却返回来一个“大树”。
于是想的最简单的方法就是在不修改底层代码的情况下,将下层的DataTable转化为我们真正想要的Domain Object,但是如果手写序列化是相当的繁琐的,有没有简单的方法了,突然遇到了Json.net这个神器,一切迎刃而解。
Code Show:
namespace Sql2Json { public class SqlResponse { public bool IsSuccess { get; set; } public string Message { get; set; } } public class SqlResponse<T> : SqlResponse { public T Json { get; set; } } public class Operation { private string _connectionString = string.Empty; public Operation( string server, string username, string password, string initDb = null, bool useWindowsAuth = false) { _connectionString = BuildConnectionString(server, username, password, initDb, useWindowsAuth); } /// <summary> /// Sql response /// </summary> /// <param name="sql"></param> /// <returns></returns> public SqlResponse<string> SqlToJson(string sql) { try { var reader = GetDataTable(sql); var json = DataReaderToJson(reader); return new SqlResponse<string>() { IsSuccess = true, Json = json }; } catch (Exception ex) { return new SqlResponse<string>() { IsSuccess = false, Message = ex.Message }; } } private DataTable GetDataTable(string sql) { using (SqlConnection conn=new SqlConnection(_connectionString)) { conn.Open(); using (SqlDataAdapter da=new SqlDataAdapter(sql,conn)) { DataSet ds = new DataSet(); da.Fill(ds); return ds.Tables[0]; } } } private string DataReaderToJson(DataTable dt) { var json = JsonConvert.SerializeObject(dt, Formatting.Indented); return json; } private string BuildConnectionString( string server, string username, string password, string initDb, bool useWindowsAuth) { var builder = new SqlConnectionStringBuilder { DataSource = server, InitialCatalog = initDb }; if (!useWindowsAuth) { builder.UserID = username; builder.Password = password; } else { builder.IntegratedSecurity = true; } return builder.ConnectionString; } } }
执行结果:
[ { "id": 3, "NickName": "小春春", "UserEmail": "[email protected]", "UserTel": "151001", "UserPass": "123", "CreateTime": "2014-07-15T00:00:00", "IsUse": 1 } ]
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。