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

标签 c# asp.net json serialization sqldatareader

我想将检索到的数据转换为 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;
}

最佳答案

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

请注意,上面的代码期望从读取器返回一行。如果您期望不止一行,那么您将需要使用另一个循环并将结果数据放入 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);
                }
            }
        }

        ...

关于c# - 通过 SqlDataReader 从数据库中检索数据并将其转换为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33450298/

相关文章:

c# - XAML 分组 ListView : Changing a row background color

c# - 返回对对象的引用

c# - 如何正确设置网络服务网址?

asp.net - 如何使用 Owin Katana 记录器

c# - 如何从一个类中调用一个 double 方法以便它可以在 C# 中的多个类中使用?

c# - Metro 应用程序的 C# Visual Studio 11 中的事件处理程序错误

asp.net - ASP.NET 2.0/3.5中的XHTML 1.0严格(或过渡性)合规性

json - 如何将 JSON 数据从 Node 发送到 Angular 4

java - 使用 Volley 为 JSON 请求自定义对象绑定(bind)

android - 如何使用 Gson 显示来自 JSON 的数据