- 在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];
.......
}