通过 SqlDataReader 从数据库中检索数据并将其转换为 JSON
Retrieving data from a database through SqlDataReader and converting it to JSON
我想将检索到的数据转换成JSON
;我正在使用 SqlDataReader
进行检索。为此,我需要将我的数据存储到 var
中。
我收到此错误:
An exception of type 'System.Reflection.AmbiguousMatchException' occurred in mscorlib.dll but was not handled in user code
Additional information: Ambiguous match found.
在以下代码中:
public string GetDetails(int Id)
{
var jsonDoc = "";
string con = "server=FACULTY01\SQLSERVER2012ENT; database=SampleDb; uid=sa; pwd=sa9";
SqlConnection scon = new SqlConnection(con);
string qry = "Select * from Information where ID =" + Id;
SqlCommand cmd = new SqlCommand(qry, scon);
scon.Open();
SqlDataReader rdr = cmd.ExecuteReader();
var details = rdr;
JavaScriptSerializer jss = new JavaScriptSerializer();
jsonDoc = jss.Serialize(details);
scon.Close();
return jsonDoc;
}
您需要一个循环来存储来自 reader 的数据。使用 DataTable 来存储完整的 table。单个变量将存储单列数据。
while (rdr.Read())
{
var details = rdr["columnName"];
}
您不能直接序列化 SqlDataReader
并期望输出包含来自 SQL 查询的数据。这不是 SqlDataReader
的工作方式。 SqlDataReader
是一种从 SQL 结果中检索数据的方法。您可以使用它来填充其他一些对象(例如您定义的 Dictionary<string, object>
或强类型 class),然后您可以将其交给序列化程序以生成 JSON.
试试下面的代码。 (另请注意使用 using
语句和参数化 SQL 以保持良好的编码习惯,如@Jon Skeet 所述。)
public static string GetDetails(int Id)
{
string con = "server=FACULTY01\SQLSERVER2012ENT; database=SampleDb; uid=sa; pwd=sa9";
using (SqlConnection scon = new SqlConnection(con))
{
string qry = "Select * from Information where ID = @id";
SqlCommand cmd = new SqlCommand(qry, scon);
cmd.Parameters.AddWithValue("@id", Id);
scon.Open();
var details = new Dictionary<string, object>();
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.HasRows && rdr.Read())
{
for (int i = 0; i < rdr.FieldCount; i++)
{
details.Add(rdr.GetName(i), rdr.IsDBNull(i) ? null : rdr.GetValue(i));
}
}
}
JavaScriptSerializer jss = new JavaScriptSerializer();
string jsonDoc = jss.Serialize(details);
scon.Close();
return jsonDoc;
}
}
请注意,上面的代码期望从 reader 返回一行。如果您期望不止一行,那么您将需要使用另一个循环并将结果数据放入 List<Dictionary<string, object>>
中。这是您需要更改的部分:
...
var details = new List<Dictionary<string, object>>();
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.HasRows)
{
while (rdr.Read())
{
var dict = new Dictionary<string, object>();
for (int i = 0; i < rdr.FieldCount; i++)
{
dict.Add(rdr.GetName(i), rdr.IsDBNull(i) ? null : rdr.GetValue(i));
}
details.Add(dict);
}
}
}
...
遇到这个 post,因为它在 google 搜索中排在第一位。
已回答here (based on this):
要求有点相似,即将 sqldatareader 结果转换为 json 字符串。
public static class MyExtensions
{
public async static Task<string> toJSON(this SqlDataReader reader)
{
var results = await reader.GetSerialized();
return JsonConvert.SerializeObject(results, Formatting.Indented);
}
public async static Task<IEnumerable<Dictionary<string, object>>> GetSerialized(this SqlDataReader reader)
{
var results = new List<Dictionary<string, object>>();
var cols = new List<string>();
for (var i = 0; i < reader.FieldCount; i++)
cols.Add(reader.GetName(i));
while (await reader.ReadAsync())
results.Add(SerializeRow(cols, reader));
return results;
}
private static Dictionary<string, object> SerializeRow(IEnumerable<string> cols,
SqlDataReader reader)
{
var result = new Dictionary<string, object>();
foreach (var col in cols)
result.Add(col, reader[col]);
return result;
}
}
用作:
var result = await reader.GetSerialized(); //to get the result object
或
string strResult = await reader.toJSON(); //to get the result string
我想将检索到的数据转换成JSON
;我正在使用 SqlDataReader
进行检索。为此,我需要将我的数据存储到 var
中。
我收到此错误:
An exception of type 'System.Reflection.AmbiguousMatchException' occurred in mscorlib.dll but was not handled in user code
Additional information: Ambiguous match found.
在以下代码中:
public string GetDetails(int Id)
{
var jsonDoc = "";
string con = "server=FACULTY01\SQLSERVER2012ENT; database=SampleDb; uid=sa; pwd=sa9";
SqlConnection scon = new SqlConnection(con);
string qry = "Select * from Information where ID =" + Id;
SqlCommand cmd = new SqlCommand(qry, scon);
scon.Open();
SqlDataReader rdr = cmd.ExecuteReader();
var details = rdr;
JavaScriptSerializer jss = new JavaScriptSerializer();
jsonDoc = jss.Serialize(details);
scon.Close();
return jsonDoc;
}
您需要一个循环来存储来自 reader 的数据。使用 DataTable 来存储完整的 table。单个变量将存储单列数据。
while (rdr.Read())
{
var details = rdr["columnName"];
}
您不能直接序列化 SqlDataReader
并期望输出包含来自 SQL 查询的数据。这不是 SqlDataReader
的工作方式。 SqlDataReader
是一种从 SQL 结果中检索数据的方法。您可以使用它来填充其他一些对象(例如您定义的 Dictionary<string, object>
或强类型 class),然后您可以将其交给序列化程序以生成 JSON.
试试下面的代码。 (另请注意使用 using
语句和参数化 SQL 以保持良好的编码习惯,如@Jon Skeet 所述。)
public static string GetDetails(int Id)
{
string con = "server=FACULTY01\SQLSERVER2012ENT; database=SampleDb; uid=sa; pwd=sa9";
using (SqlConnection scon = new SqlConnection(con))
{
string qry = "Select * from Information where ID = @id";
SqlCommand cmd = new SqlCommand(qry, scon);
cmd.Parameters.AddWithValue("@id", Id);
scon.Open();
var details = new Dictionary<string, object>();
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.HasRows && rdr.Read())
{
for (int i = 0; i < rdr.FieldCount; i++)
{
details.Add(rdr.GetName(i), rdr.IsDBNull(i) ? null : rdr.GetValue(i));
}
}
}
JavaScriptSerializer jss = new JavaScriptSerializer();
string jsonDoc = jss.Serialize(details);
scon.Close();
return jsonDoc;
}
}
请注意,上面的代码期望从 reader 返回一行。如果您期望不止一行,那么您将需要使用另一个循环并将结果数据放入 List<Dictionary<string, object>>
中。这是您需要更改的部分:
...
var details = new List<Dictionary<string, object>>();
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.HasRows)
{
while (rdr.Read())
{
var dict = new Dictionary<string, object>();
for (int i = 0; i < rdr.FieldCount; i++)
{
dict.Add(rdr.GetName(i), rdr.IsDBNull(i) ? null : rdr.GetValue(i));
}
details.Add(dict);
}
}
}
...
遇到这个 post,因为它在 google 搜索中排在第一位。
已回答here (based on this):
要求有点相似,即将 sqldatareader 结果转换为 json 字符串。
public static class MyExtensions
{
public async static Task<string> toJSON(this SqlDataReader reader)
{
var results = await reader.GetSerialized();
return JsonConvert.SerializeObject(results, Formatting.Indented);
}
public async static Task<IEnumerable<Dictionary<string, object>>> GetSerialized(this SqlDataReader reader)
{
var results = new List<Dictionary<string, object>>();
var cols = new List<string>();
for (var i = 0; i < reader.FieldCount; i++)
cols.Add(reader.GetName(i));
while (await reader.ReadAsync())
results.Add(SerializeRow(cols, reader));
return results;
}
private static Dictionary<string, object> SerializeRow(IEnumerable<string> cols,
SqlDataReader reader)
{
var result = new Dictionary<string, object>();
foreach (var col in cols)
result.Add(col, reader[col]);
return result;
}
}
用作:
var result = await reader.GetSerialized(); //to get the result object
或
string strResult = await reader.toJSON(); //to get the result string