Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从SqlDataReader创建JSON字符串 更新_C#_Asp.net_Database_Json_Json.net - Fatal编程技术网

C# 从SqlDataReader创建JSON字符串 更新

C# 从SqlDataReader创建JSON字符串 更新,c#,asp.net,database,json,json.net,C#,Asp.net,Database,Json,Json.net,我想出来了 我试图创建一个JSON字符串,表示数据库表中的一行,以在HTTP响应中返回。这似乎是一个很好的利用工具。但是,我不知道如何在从数据库读取数据时构建JSON字符串 这个问题的标志是令人讨厌的评论/***************/ // connect to DB theSqlConnection.Open(); // open the connection SqlDataReader reader = sqlCommand.ExecuteReader(); if (reader.H

我想出来了


我试图创建一个JSON字符串,表示数据库表中的一行,以在HTTP响应中返回。这似乎是一个很好的利用工具。但是,我不知道如何在从数据库读取数据时构建JSON字符串

这个问题的标志是令人讨厌的评论
/***************/

// connect to DB
theSqlConnection.Open(); // open the connection

SqlDataReader reader = sqlCommand.ExecuteReader();
if (reader.HasRows) {

    while(reader.Read()) {

        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);

        using (JsonWriter jsonWriter = new JsonTextWriter(sw)) {

            // read columns from the current row and build this JsonWriter
            jsonWriter.WriteStartObject();
            jsonWriter.WritePropertyName("FirstName");

            // I need to read the value from the database
/******** I can't just say reader[i] to get the ith column. How would I loop here to get all columns? ********/
            jsonWriter.WriteValue(... ? ...);
            jsonWriter.WritePropertyName("LastName");
            jsonWriter.WriteValue(... ? ...);
            jsonWriter.WritePropertyName("Email");
            jsonWriter.WriteValue(... ? ...);

            // etc...
            jsonWriter.WriteEndObject();
        }
    }
}
问题是我不知道如何从
SqlReader
读取行中的每一列,以便调用
WriteValue
并为其提供正确的信息并将其附加到正确的列名。所以如果一排看起来像这样

| FirstName | LastName | Email |
。。。如何为每个这样的行创建一个
JsonWriter
,使其包含该行的所有列名和每列中的相应值,然后使用该
JsonWriter
构建一个JSON字符串,以便通过HTTP响应返回


如果我需要澄清任何事情,请告诉我。

为特定示例编辑:

theSqlConnection.Open();

SqlDataReader reader = sqlCommand.ExecuteReader();
DataTable schemaTable = reader.GetSchemaTable();

foreach (DataRow row in schemaTable.Rows)
{
    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);

    using (JsonWriter jsonWriter = new JsonTextWriter(sw)) 
    {    
        jsonWriter.WriteStartObject();

        foreach (DataColumn column in schemaTable.Columns)
        {
            jsonWriter.WritePropertyName(column.ColumnName);
            jsonWriter.WriteValue(row[column]);
        }

        jsonWriter.WriteEndObject();
    }
}

theSqlConnection.Close();
明白了!这是C#

感谢他的回答,他的回答启发了我找到了我的解决方案


Hristo

我的版本:

theSqlConnection.Open();

SqlDataReader reader = sqlCommand.ExecuteReader();
DataTable schemaTable = reader.GetSchemaTable();

foreach (DataRow row in schemaTable.Rows)
{
    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);

    using (JsonWriter jsonWriter = new JsonTextWriter(sw)) 
    {    
        jsonWriter.WriteStartObject();

        foreach (DataColumn column in schemaTable.Columns)
        {
            jsonWriter.WritePropertyName(column.ColumnName);
            jsonWriter.WriteValue(row[column]);
        }

        jsonWriter.WriteEndObject();
    }
}

theSqlConnection.Close();
这不使用DataSchema,也将结果包装在一个数组中,而不是每行使用一个writer

SqlDataReader rdr = cmd.ExecuteReader();

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);    

using (JsonWriter jsonWriter = new JsonTextWriter(sw)) 
{    
    jsonWriter.WriteStartArray();

    while (rdr.Read())
    {
        jsonWriter.WriteStartObject();

        int fields = rdr.FieldCount;

        for (int i = 0; i < fields; i++)
        { 
            jsonWriter.WritePropertyName(rdr.GetName(i));
            jsonWriter.WriteValue(rdr[i]);
        }

        jsonWriter.WriteEndObject();
    }

    jsonWriter.WriteEndArray();
}
SqlDataReader rdr=cmd.ExecuteReader();
StringBuilder sb=新的StringBuilder();
StringWriter sw=新的StringWriter(sb);
使用(JsonWriter-JsonWriter=newjsontextwriter(sw))
{    
jsonWriter.WriteStartArray();
while(rdr.Read())
{
jsonWriter.WriteStartObject();
int fields=rdr.FieldCount;
对于(int i=0;i
我使用以下方法将任何DataReader转换为JSON,但仅用于单深度序列化:

您应该将读卡器和列名作为字符串数组传递,例如:

String [] columns = {"CustomerID", "CustomerName", "CustomerDOB"};
然后调用该方法

public static String json_encode(IDataReader reader, String[] columns)
    {
        int length = columns.Length;

        String res = "{";

        while (reader.Read())
        {
            res += "{";

            for (int i = 0; i < length; i++)
            {
                res += "\"" + columns[i] + "\":\"" + reader[columns[i]].ToString() + "\"";

                if (i < length - 1)
                    res += ",";
            }

            res += "}";
        }

        res += "}";

        return res;
    }
公共静态字符串json_encode(IDataReader阅读器,字符串[]列)
{
int length=columns.length;
字符串res=“{”;
while(reader.Read())
{
res+=“{”;
for(int i=0;i
编辑答案以显示msdn示例。您也可以在该页面上查看其他类似操作的方法。@Scott。。。令人惊叹的!我会把这些放在一起。一旦我重新获得向上投票的特权,我会给你一个+1,从上面你可以推断出如何将其纳入你的具体需要。@Hristo-让我为你再次编辑答案。我以前从未使用过Json.NET,但我会编辑到我想尝试的内容。@Hristo-没问题,让我知道。。。我也很想知道!祝你好运,非常有帮助!非常感谢你!这个答案,再加上at的答案,解决了我的问题!非常感谢。如果您的datareader中有多行,这会在JSON响应中为您提供一个对象数组吗?i、 e.
[{“row1-col1”:“dataABC”,“row1col2”:“dataDEF”},{“row2col1”:“更多数据”,“row2col2”:“甚至更多”}]
-我有点惊讶微软在.NET 4.5+中没有为此提供内置方法……应该使用
StringBuilder
对象或类似的东西,否则,您将重建整个字符串并一遍又一遍地复制它
public static String json_encode(IDataReader reader, String[] columns)
    {
        int length = columns.Length;

        String res = "{";

        while (reader.Read())
        {
            res += "{";

            for (int i = 0; i < length; i++)
            {
                res += "\"" + columns[i] + "\":\"" + reader[columns[i]].ToString() + "\"";

                if (i < length - 1)
                    res += ",";
            }

            res += "}";
        }

        res += "}";

        return res;
    }