C# 如何使用SqlCommand和SqlDataReader在C中返回Json结果
我试图在SqlCommand中使用SQL查询,我希望看到从SQLServer数据库返回的完整结果集,然后返回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
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)
{
}