首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过SqlDataReader从数据库中检索数据并将其转换为JSON

通过SqlDataReader从数据库中检索数据并将其转换为JSON
EN

Stack Overflow用户
提问于 2015-10-31 10:00:36
回答 3查看 6.4K关注 0票数 3

我希望将检索到的数据转换为JSON;我使用SqlDataReader进行检索。为此,我需要将数据存储到var中。我得到了这个错误:

“System.Reflection.AmbiguousMatchException”类型的异常发生在mscorlib.dll中,但未在用户代码中处理 附加信息:找到不明确的匹配。

在以下代码中:

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-31 21:06:27

不能直接序列化SqlDataReader并期望输出包含来自SQL查询的数据。这不是SqlDataReader的工作方式。SqlDataReader是从SQL结果中检索数据的一种方法。您可以使用它填充其他对象(例如Dictionary<string, object>或定义的强类型类),然后将其交给序列化程序以生成JSON。

尝试下面的代码。(还请注意using语句和参数化SQL的使用符合良好的编码实践,如@Jon所述。)

代码语言:javascript
复制
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;
    }
}

请注意,上面的代码期望从读取器返回一个行。如果需要多个行,则需要使用另一个循环,并将结果数据放入List<Dictionary<string, object>>中。以下是您需要更改的部分:

代码语言:javascript
复制
        ...

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

        ...
票数 4
EN

Stack Overflow用户

发布于 2015-10-31 11:07:37

您需要一个循环来存储来自阅读器的数据。使用DataTable存储完整的表。单个变量将存储单列数据。

代码语言:javascript
复制
while (rdr.Read())
{
    var details = rdr["columnName"];
}
票数 1
EN

Stack Overflow用户

发布于 2016-11-16 12:33:54

遇到这篇文章,因为它在谷歌搜索的第一位。

给出了答案here (基于this):

这种要求有点类似于将sqldatareader结果转换为json字符串。

代码语言:javascript
复制
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;
        }
    }

用作:

代码语言:javascript
复制
var result = await reader.GetSerialized(); //to get the result object

代码语言:javascript
复制
string strResult = await reader.toJSON(); //to get the result string
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33450298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档