создать строку JSON из SqlDataReader - PullRequest
10 голосов
/ 05 апреля 2011

UPDATE

Я понял это. Проверьте мой ответ ниже .


Я пытаюсь создать строку JSON, представляющую строку из таблицы базы данных для возврата в ответе HTTP. Кажется, что Json.NET будет хорошим инструментом для использования. Тем не менее, я не уверен, как создать строку 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-ответ?

Дайте мне знать, если мне нужно что-то прояснить.

Ответы [ 4 ]

20 голосов
/ 11 февраля 2013

Моя версия:

Это не использует DataSchema, а также упаковывает результаты в массив, вместо использования пишущего для каждой строки.

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();
}
6 голосов
/ 05 апреля 2011

РЕДАКТИРОВАНИЕ ДЛЯ КОНКРЕТНОГО ПРИМЕРА:

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();
4 голосов
/ 08 апреля 2011

Понял!Вот C # ...

// ... SQL connection and command set up, only querying 1 row from the table
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
JsonWriter jsonWriter = new JsonTextWriter(sw);

try {

    theSqlConnection.Open(); // open the connection

    // read the row from the table
    SqlDataReader reader = sqlCommand.ExecuteReader();
    reader.Read();

    int fieldcount = reader.FieldCount; // count how many columns are in the row
    object[] values = new object[fieldcount]; // storage for column values
    reader.GetValues(values); // extract the values in each column

    jsonWriter.WriteStartObject();
    for (int index = 0; index < fieldcount; index++) { // iterate through all columns

        jsonWriter.WritePropertyName(reader.GetName(index)); // column name
        jsonWriter.WriteValue(values[index]); // value in column

    }
    jsonWriter.WriteEndObject();

    reader.Close();

} catch (SqlException sqlException) { // exception
    context.Response.ContentType = "text/plain";
    context.Response.Write("Connection Exception: ");
    context.Response.Write(sqlException.ToString() + "\n");
} finally {
    theSqlConnection.Close(); // close the connection
}
// END of method
// the above method returns sb and another uses it to return as HTTP Response...
StringBuilder theTicket = getInfo(context, ticketID);
context.Response.ContentType = "application/json";
context.Response.Write(theTicket);

... поэтому переменная StringBuilder sb - это объект JSON, представляющий строку, которую я хотел запросить.Вот код JavaScript ...

$.ajax({
    type: 'GET',
    url: 'Preview.ashx',
    data: 'ticketID=' + ticketID,
    dataType: "json",
    success: function (data) {

        // data is the JSON object the server spits out
        // do stuff with the data
    }
});

Спасибо Скотту за его ответ, который вдохновил меня прийти к моему решению.

Христо

0 голосов
/ 29 сентября 2013

Я сделал следующий метод, где он преобразует любой 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...