C# 从动态SQL查询返回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();

在我的数据访问层中,当我想将某些内容序列化为JSON并将其提供给客户机时,我一直在做类似的事情

 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");