create JSON string from SqlDataReader

前端 未结 4 1959
予麋鹿
予麋鹿 2021-02-08 03:55

UPDATE

I figured it out. Check out my answer below.


I\'m trying to create a JSON string representing a row from a database table to return in an HTTP res

相关标签:
4条回答
  • 2021-02-08 04:28

    EDITED FOR SPECIFIC EXAMPLE:

    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();
    
    0 讨论(0)
  • 2021-02-08 04:30

    I made the following method where it converts any DataReader to JSON, but only for single depth serialization:

    you should pass the reader, and the column names as a string array, for example:

    String [] columns = {"CustomerID", "CustomerName", "CustomerDOB"};
    

    then call the method

    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;
        }
    
    0 讨论(0)
  • 2021-02-08 04:31

    My version:

    This doesn't use DataSchema and also wraps the results in an array, instead of using a writer per row.

    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();
    }
    
    0 讨论(0)
  • 2021-02-08 04:43

    Got it! Here's the 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);
    

    ... so the StringBuilder sb variable is the JSON object that represents the row I wanted to query. Here is the 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
        }
    });
    

    Thanks to Scott for his answer which inspired me to come to my solution.

    Hristo

    0 讨论(0)
提交回复
热议问题