您的位置:首页 > 博客中心 > 数据库 >

分享一个自己写的工具Sql2Json

时间:2022-03-10 18:15

gxlsystem.com,布布扣

前言

最近在维护一个公司之前自己开发的项目,项目使用的了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
  }
]

 

分享一个自己写的工具Sql2Json,布布扣,bubuko.com

热门排行

今日推荐

热门手游