C# 从动态SQL查询返回JSON
在我的数据访问层中,当我想将某些内容序列化为JSON并将其提供给客户机时,我一直在做类似的事情C# 从动态SQL查询返回JSON,c#,asp.net-mvc,json,C#,Asp.net Mvc,Json,在我的数据访问层中,当我想将某些内容序列化为JSON并将其提供给客户机时,我一直在做类似的事情 using (var con = new SqlConnection(connectionString)) { using (var cmd = new SqlCommand("spGetLengthsOfStay", con)) { con.Open();
using (var con = new SqlConnection(connectionString))
{
using (var cmd = new SqlCommand("spGetLengthsOfStay", con))
{
con.Open();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
var los = new LOS();
los.VisitId = (int)rdr["VisitId"];
los.PatientId = (int)rdr["PatientId"];
los.Gender = (string)rdr["Gender"];
los.Age = (int)rdr["Age"];
los.Discharge = (string)rdr["Discharge"];
los.LengthOfStay = (int)rdr["LengthOfStay"];
losList.Add(los);
}
}
}
有些实例需要使用动态生成的SQL查询查询数据库,因此我并不总是知道创建对象的单个实例、将其添加到列表并返回列表的属性。在不使用具体类型的.NET MVC的情况下,将SQL查询结果一次返回到客户端的首选方法是什么?使用System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Dynamic;
using Newtonsoft.Json;
// microsoft sqlserver
using System.Data.SqlClient;
// oracle
using Oracle.ManagedDataAccess.Client;
namespace InqdWeb
{
public class Dbio
{
//
public static class Consts
{
public const string msgname = "retmsg";
public const string valname = "retval";
public const string jsond = "{ }";
public const string jsonr = "{ \"" + msgname + "\": \"OK\" }";
}
//
//
// »»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
// core functions
// »»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
//
//
// with a "sql statement"
// and a connection id,
// prepare the actual sql to get data
// return the result as json
public static string sqljson
(string pi_sql
, string pi_conn
)
{
// empty data
var vd = Consts.jsond;
// success message
var vr = Consts.jsonr;
string msgout = "00";
var ld = new List<dynamic>();
ld = sqlmaster(pi_sql, pi_conn, out msgout);
//
if (msgout.Substring(0, 2) == "00") // not empty and no errors
{
vd = JsonConvert.SerializeObject(ld);
vr = Consts.jsonr.Replace("OK", "00");
}
if (msgout.Substring(0, 2) == "10") // empty and no errors
{
vr = Consts.jsonr.Replace("OK", "10");
}
if (msgout.Substring(1, 1) == "1") // error
{
vd = JsonConvert.SerializeObject(ld);
vr = Consts.jsonr.Replace("OK", msgout);
}
// return json with 2 collections: d with data, r with status and message
var vt = jsonmerge(vd, vr);
return vt;
}
//
//
//
// with a sql
// and a conn id
// return data as dynamic list
public static List<dynamic> sqlmaster
(string pi_sql
, string pi_conn
, out string po_msg
)
{
string sql = " ";
sql = pi_sql;
// result
po_msg = msgout;
// po_msg pos1 empty: 1 has rows: 0
// pos2 error: >0 no error: 0
// pos3... error message
return lista;
}
//
//
// with a sql statement
// and a connection string
// return the result on a dynamic list
// plus a string with
// pos1 error 0-ok 1-error
// pos2 list empty 0-ok 1-list is empty
// pos3... message return code from non-select or error message
public static List<dynamic> sqldo
(string pi_sql
, string pi_connstring
, out string msgout
)
{
// variables
string sql = pi_sql;
var lista = new List<dynamic>();
int retcode;
msgout = "0";
//
string ConnString = pi_connstring;
//
//
//
// Microsoft SqlServer
if (SqlFlavor == "Ms")
{
using (SqlConnection con = new SqlConnection(ConnString))
{
try
{
con.Open();
SqlCommand cmd = new SqlCommand(sql, con);
if (sqltype == "R")
{
SqlDataReader reada = cmd.ExecuteReader();
string datatype = "-";
string colname = "-";
while (reada.Read())
{
var obj = new ExpandoObject();
var d = obj as IDictionary<String, object>;
//
for (int index = 0; index < reada.FieldCount; index++)
{
datatype = reada.GetDataTypeName(index);
colname = reada.GetName(index);
bool isnul = reada.IsDBNull(index);
if (!isnul)
{
// add datatypes as needed
switch (datatype)
{
case "int":
d[colname] = reada.GetValue(index);
break;
case "varchar":
d[colname] = reada.GetString(index);
break;
case "nvarchar":
d[colname] = reada.GetString(index);
break;
case "date":
d[colname] = reada.GetDateTime(index);
break;
default:
d[colname] = reada.GetString(index);
break;
}
}
else
{
d[colname] = "";
}
}
lista.Add(obj);
}
reada.Close();
}
}
catch (Exception ex)
{
msgout = "11" + ex.Message.ToString();
}
}
}
//
// Oracle
if (SqlFlavor == "Oa")
{
// Or uses a "
sql = sql.Replace("[", "\"");
sql = sql.Replace("]", "\"");
using (OracleConnection con = new OracleConnection(ConnString))
{
try
{
con.Open();
//
OracleCommand cmd = new OracleCommand(sql, con);
OracleDataReader reada = cmd.ExecuteReader();
string datatype = "-";
string colname = "-";
while (reada.Read())
{
var obj = new ExpandoObject();
var d = obj as IDictionary<String, object>;
// browse every column
for (int index = 0; index < reada.FieldCount; index++)
{
datatype = reada.GetDataTypeName(index);
colname = reada.GetName(index);
bool isnul = reada.IsDBNull(index);
if (!isnul)
{
// add datatypes as needed
switch (datatype)
{
case "Decimal":
d[colname] = reada.GetValue(index);
break;
case "Varchar":
d[colname] = reada.GetString(index);
break;
default:
d[colname] = reada.GetString(index);
break;
}
}
else
{
d[colname] = "";
}
}
lista.Add(obj);
}
reada.Close();
//
}
catch (Exception ex)
{
msgout = "11" + ex.Message.ToString();
}
}
}
//
//
//
return lista;
}
//
//
}
使用System.Collections.Generic;
使用System.Linq;
运用系统动力学;
使用Newtonsoft.Json;
//微软sqlserver
使用System.Data.SqlClient;
//神谕
使用Oracle.ManagedDataAccess.Client;
命名空间InqdWeb
{
公共类Dbio
{
//
公共静态类常量
{
公共常量字符串msgname=“retmsg”;
public const string valname=“retval”;
公共常量字符串jsond=“{}”;
public const string jsonr=“{\”“+msgname+”\:\“OK\”}”;
}
//
//
// »»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
//核心功能
// »»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
//
//
//使用“sql语句”
//和一个连接id,
//准备实际sql以获取数据
//将结果作为json返回
公共静态字符串sqljson
(字符串pi_sql)
,字符串pi_conn
)
{
//空数据
var vd=常数jsond;
//成功信息
var vr=Consts.jsonr;
字符串msgout=“00”;
var ld=新列表();
ld=sqlmaster(pi_sql、pi_conn、out msgout);
//
if(msgout.Substring(0,2)=“00”)//不为空且无错误
{
vd=JsonConvert.SerializeObject(ld);
vr=常数jsonr.替换(“正常”、“00”);
}
if(msgout.Substring(0,2)=“10”)//为空且无错误
{
vr=常数jsonr.替换(“正常”、“10”);
}
if(msgout.Substring(1,1)=“1”)//错误
{
vd=JsonConvert.SerializeObject(ld);
vr=常数jsonr.Replace(“正常”,msgout);
}
//返回包含2个集合的json:d包含数据,r包含状态和消息
var vt=jsonmerge(vd,vr);
返回vt;
}
//
//
//
//使用sql
//还有一张驾驶证
//以动态列表的形式返回数据
公共静态列表sqlmaster
(字符串pi_sql)
,字符串pi_conn
,输出字符串po_msg
)
{
字符串sql=“”;
sql=pi_-sql;
//结果
po_msg=msgout;
//po_msg pos1空:1有行:0
//pos2错误:>0无错误:0
//pos3…错误消息
返回列表a;
}
//
//
//使用sql语句
//和一个连接字符串
//在动态列表中返回结果
//加上一串
//pos1错误0-正常1-错误
//pos2列表为空0-确定1-列表为空
//pos3…来自非选择或错误消息的消息返回代码
公共静态列表sqldo
(字符串pi_sql)
,string pi_connstring
,输出字符串msgout
)
{
//变数
字符串sql=pi_-sql;
var lista=新列表();
int-retcode;
msgout=“0”;
//
字符串ConnString=pi_ConnString;
//
//
//
//微软SqlServer
如果(SqlFlavor==“Ms”)
{
使用(SqlConnection con=newsqlconnection(ConnString))
{
尝试
{
con.Open();
SqlCommand cmd=新的SqlCommand(sql,con);
如果(sqltype==“R”)
{
SqlDataReader reada=cmd.ExecuteReader();
字符串数据类型=“-”;
字符串colname=“-”;
while(reada.Read())
{
var obj=新的ExpandoObject();
var d=作为索引的obj;
//
for(int index=0;indexstring vret = "{'r':{'retval': 'OK' }}";
string sqltxt;
string connt;
connt = ConfigurationManager.ConnectionStrings["<your connection>"].ConnectionString;
sqltxt = "<your select>";
vret = Dbio.sqljson(sqltxt, connt, "MsX"); // MsX for MsSqlServer
return Content(vret, "application/json");