将Mysql查询结果转化成Jason字符串

  • 在asp.net端,实现一个名为 QueryMSSL.ashx 的服务:

这样,在url参数上输入任何sql语句,就可以访问SQL Server查询结果了。结果是以json对象集合方式返回的,不管客户端是什么平台,这种协议设计都是非常通用的、容易调试。
 

​
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Dynamic;
using System.Web;
 
namespace roar
{
    public class QueryMSSQL : IHttpHandler
    {
 
        private const string ConnectionString = "Password=cutt;Persist Security Info=True;User ID=sa;Initial Catalog=TapWaterLeaders;Data Source=192.168.1.198";
 
        public void ProcessRequest(HttpContext context)
        {
            try
            {
                var sql = context.Server.UrlDecode(context.Request.QueryString["sql"]);
                using (var conn = new SqlConnection(ConnectionString))
                {
                    conn.Open();
                    var comm = conn.CreateCommand();
                    comm.CommandText = sql;
                    comm.CommandType = System.Data.CommandType.Text;
                    var result = new List<ExpandoObject>();
                    var reader = comm.ExecuteReader();
                    while (reader.Read())
                    {
                        var record = new ExpandoObject();
                        result.Add(record);
                        var dic = (IDictionary<string, object>)record;
                        for (var i = 0; i < reader.FieldCount; i++)
                            dic.Add(reader.GetName(i), reader[i]);
                    }
                    var jsonResult = JsonConvert.SerializeObject(result);   //将记录集合转换为json字符串
                    context.Response.ContentType = "text/plain";
                    context.Response.Write(jsonResult);
                }
            }
            catch
            {
                context.Response.StatusCode = 500;
            }
        }
 
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

​
  • 在silverlight端,可以实现这样的查询网关:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Net;
using System.Windows;
using System.Windows.Browser;
 
namespace SL端命名空间
{
    public static class Extensions
    {
        public static void QueryMSSQL(this string sql, Action<IEnumerable<dynamic>> callback)
        {
            if (callback != null)
            {
                var web = new WebClient();
                web.DownloadStringCompleted += (s, e) =>
                {
                    if (e.Error == null)
                    {
                        var result = JsonConvert.DeserializeObject<ExpandoObject[]>(e.Result);
                        callback(result);
                    }
                };
                var uri = new Uri(Application.Current.Host.Source, "../QueryMSSQL.ashx?sql=" + HttpUtility.UrlEncode(sql));
                web.DownloadStringAsync(uri);
            }
        }
 
    }
}

可以得到了一个灵活的 dynamic[] 类型的数据集合。就好像那种老式的 DataTable 一样,你可以灵活地访问没一个记录和记录中的每一个字段。例如下面这个查询,不但使用sql语句在数据库端过滤,在客户端也可以灵活地读取查询到的数据集合的属性。

对于 dynamic 类型的数据,由于我们知道它其实就是 ExpandoObject 类型的对象,我们可以这样来枚举其属性:

var dic= (IDictionary<string,object>)u;
foreach(var k in dic.Keys)
{
    var value = dic[k];
    .......
}

猜你喜欢

转载自blog.csdn.net/weixin_42171657/article/details/81482470