111,113
社区成员




using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Dynamic;
using System.Threading;
using System.Web;
public class QueryMSSQL : IHttpHandler
{
// 查询数据库,将查询结果转换为 json 数据 table 格式返回
public void ProcessRequest(HttpContext context)
{
try
{
var sql = context.Server.UrlDecode(context.Request.QueryString["sql"]);
var jsonResult = Query(sql);
context.Response.ContentType = "text/plain";
context.Response.Write(jsonResult);
}
catch
{
context.Response.StatusCode = 500;
}
}
private static string Query(string sql)
{
var key = string.Format("查询_{0}_的结果", sql);
var cache = HttpRuntime.Cache;
var jsonResult = (string)cache[key];
if (jsonResult == null)
{
var eh1 = new ManualResetEvent(false);
var eh2 = new ManualResetEvent(false);
List<ExpandoObject> result;
List<ExpandoObject> r1 = null;
List<ExpandoObject> r2 = null;
ThreadPool.QueueUserWorkItem(h =>
{
string ConnectionString = "........第二个实例.........";
r2 = GetResults(sql, ConnectionString);
eh2.Set();
});
ThreadPool.QueueUserWorkItem(h =>
{
string ConnectionString = "........第一个实例.........";
r1 = GetResults(sql, ConnectionString);
eh1.Set();
});
eh2.WaitOne();
if (r2.Count > 0)
{
result = r2;
}
else
{
eh1.WaitOne();
result = r1;
}
jsonResult = JsonConvert.SerializeObject(result); //将记录集合转换为json字符串
cache.Insert(key, jsonResult, null, DateTime.Now.AddSeconds(5), System.Web.Caching.Cache.NoSlidingExpiration); //缓存5秒钟
}
return jsonResult;
}
private static List<ExpandoObject> GetResults(string sql, string ConnectionString)
{
var result = new List<ExpandoObject>();
#if !DEBUG
try
{
#endif
using (var conn = new SqlConnection(ConnectionString))
{
conn.Open();
var comm = conn.CreateCommand();
comm.CommandText = sql;
comm.CommandType = System.Data.CommandType.Text;
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]);
}
}
#if !DEBUG
}
catch { }
#endif
return result;
}
public bool IsReusable
{
get
{
return false;
}
}
}