首页 > 代码库 > 分享一个自己写的工具Sql2Json

分享一个自己写的工具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": "1032578874@qq.com",    "UserTel": "151001",    "UserPass": "123",    "CreateTime": "2014-07-15T00:00:00",    "IsUse": 1  }]