C# 如何使用SqlCommand和SqlDataReader在C中返回Json结果

C# 如何使用SqlCommand和SqlDataReader在C中返回Json结果,c#,sql,asp.net-mvc-4,C#,Sql,Asp.net Mvc 4,我试图在SqlCommand中使用SQL查询,我希望看到从SQLServer数据库返回的完整结果集,然后返回Json格式 下面是控制器中的代码: public ActionResult GetAllSummary() { string connectionString ="Data Source=...;Initial Catalog=...;Integrated Security=True"; string query = "SELECT v.date, v.name, v

我试图在SqlCommand中使用SQL查询,我希望看到从SQLServer数据库返回的完整结果集,然后返回Json格式

下面是控制器中的代码:

public ActionResult GetAllSummary()
{
    string connectionString ="Data Source=...;Initial Catalog=...;Integrated Security=True";  
    string query = "SELECT v.date, v.name, v.numbers FROM view as v GROUP BY v.date,v.mane,v.numbers ORDER BY v.date,v.mane,v.numbers";

    using(SqlConnection conn = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(query, conn);

        try {
            conn.Open();
            SqlDataReader reader = command.ExecuteReader();

            // In this part below, I want the SqlDataReader  to 
            // read all of the records from database returned, 
            // and I want the result to be returned as Array or 
            // Json type, but I don't know how to write this part.

            while(reader.Read())
            {
                ArrayList result = new ArrayList();

                foreach(int i in reader)
                     // this line below was the code I wrote before. 
                     // But since my query returns multiple 
                     // types (datetime, string, decimal, etc..), 
                     // I don't know what C# command I can use to return
                     // the results in foreach loop. Or say I even don't 
                     // need a for/foreach loop.
                     result.Add(reader.GetValue(i));

                return Json(result, JsonRequestBehavior.AllowGet);
            }

            reader.Close();
        }
        catch(Exception ex)
        {
            var error = ex.Message;
            return View(error);
        }
    }

    return View();
}
有人能帮我做这件事吗?我将不胜感激

凯文

或者只是有趣的部分:

var dt=new DataTable();
dt.Load(myDataReader);
object[] result = new object[dt.Rows.Count + 1];

for (int i = 0; i <= dt.Rows.Count - 1; i++) {
    result[i] = dt.Rows[i].ItemArray;
}

您可以使用此扩展:

public static string ExecuteToJson(this SqlCommand cmd)
{
    if (cmd.Connection.State == ConnectionState.Closed)
    {
        cmd.Connection.Open();
    }

    using (DataTable dt = new DataTable())
    {
        using (SqlDataAdapter da = new SqlDataAdapter(cmd))
        {
            da.Fill(dt);

            List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
            Dictionary<string, object> row;
            foreach (DataRow dr in dt.Rows)
            {
                row = new Dictionary<string, object>();
                foreach (DataColumn col in dt.Columns)
                {
                    row.Add(col.ColumnName, dr[col]);
                }
                rows.Add(row);
            }

            return JsonConvert.SerializeObject(rows);
        }
    }
}

您会遇到什么错误,请尝试在while循环中放置断点,您可以在此处到达该点。。。在foreach循环内部,因此它会立即退出该方法,并在读取第一行的第一个值时返回一个结果。《读者》中的《我的心》是什么意思?@StephenMuecke实际上它不在《读者》中。他只是一个单一的命令版本,而不是块。然而,它在while循环中。将用于读取的代码移动到单独的服务,它不应位于控制器内。第二步。在while循环中创建一个具有属性Date、Name和number的模型,初始化模型实例,设置其属性并将其添加到集合中,最后返回模型集合。第三步。呼叫控制器中的服务以获取列表,然后将其返回到视图。感谢您的帮助!在第三种方法中,我如何初始化arr[]或者什么类型的arr[]呢?@QIWENHU对不起,对arr[]的引用应该是对result[]的引用。我更新了答案以反映更正。好的,实际上所有方法都有效,第三种方法适用于我的情况。再次感谢你的帮助
var dt=new DataTable();
dt.Load(myDataReader);
object[] result = new object[dt.Rows.Count + 1];

for (int i = 0; i <= dt.Rows.Count - 1; i++) {
    result[i] = dt.Rows[i].ItemArray;
}
public static string ExecuteToJson(this SqlCommand cmd)
{
    if (cmd.Connection.State == ConnectionState.Closed)
    {
        cmd.Connection.Open();
    }

    using (DataTable dt = new DataTable())
    {
        using (SqlDataAdapter da = new SqlDataAdapter(cmd))
        {
            da.Fill(dt);

            List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
            Dictionary<string, object> row;
            foreach (DataRow dr in dt.Rows)
            {
                row = new Dictionary<string, object>();
                foreach (DataColumn col in dt.Columns)
                {
                    row.Add(col.ColumnName, dr[col]);
                }
                rows.Add(row);
            }

            return JsonConvert.SerializeObject(rows);
        }
    }
}
string connectionString = "** connstr **";
string query = "SELECT * FROM `table`";

try
{
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        using (SqlCommand command = new SqlCommand(query, conn))
        {
            string json = command.ExecuteToJson(); 
        }
    }
}
catch (Exception)
{
}