开发者

Manually converting result dataset to JSON

开发者 https://www.devze.com 2023-02-14 13:10 出处:网络
I have Dat开发者_运维问答aReader that holds the results from a stored procedure caal. The results consist of two fields ...

I have Dat开发者_运维问答aReader that holds the results from a stored procedure caal. The results consist of two fields ...

UserID
UserName

Normally I bind these results to an ASP.NET dropdownlist control ...

ddlUserList.DataSource = rdr // rdr is the DataReader
ddlUserList.DataTextField = "UserName"
ddlUserList.DataValueField = "UserID"
ddlUserList.DataBind()

However I am now trying to accomplish the same thing using jQuery AJAX. What I am stuck on is how to manually convert the dataset held in the DataReader to JSON. How are multiples values separated? Does this look correct?

{{"UserID":1, "UserName":"Bob"}, {"UserID":2, "UserName":"Sally"},{"UserID":3, "UserName":"Fred"}}

I realize there are libraries out there such as JSON.NET to handle the serialization but I am in the learning stage now and want to make sure I understand everything from the bottom up.


Was wondering if you have tried using System.Web.Script.Serialization.JavaScriptSerializer library?

You can look at Rick Stahl's blog on this: http://www.west-wind.com/weblog/posts/737584.aspx

Or you could also do something like create a method that will pull out data from the datareader and place it in a list of objects. (See code below). These list of object will be serialized using the JavaScriptSerializer library.

Hope this helps!

public class User
{
     public int UserId { get; set; }
     public string UserName { get; set;}
}
public class DataLayer
{
     public string GetUsers(string connString)
     {
        string result = null;
        List<User> users = null;

        // get data using SqlReader
        using(var conn = new SqlConnection(connString))
        {
            using(var cmd = new SqlCommand{ Connection = conn, CommandText = "SELECT * FROM Users", CommandType = CommandType.Text })
            {
                conn.Open();

                var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);

                if(!reader.HasRows)
                    return null;

                //convert data reader to a list of user objects
                users = (List<User>)ConvertToList<User>(ref reader);

                conn.Close();
            }
        }

        //convert list of objects in list to json objects
        var jsonSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        result = jsonSerializer.Serialize(users);

        return result;
     }

    public static IList<T> ConvertToList<T>(ref SqlDataReader reader)
    {
        IList<T> result = null;

        if (reader.IsClosed)
            return result;

        result = new List<T>();
        T item = default(T);
        while (reader.Read())
        {
            //create item instance
            item = (T)Activator.CreateInstance<T>();
            //get class property members
            var propertyItems = item.GetType().GetProperties();
            //populate class property members with data from data reader
            for (int ctr = 0; ctr < reader.FieldCount; ctr++)
            { 
                if(reader.GetName(ctr) == propertyItems[ctr].Name)
                    propertyItems[ctr].SetValue(item, UtilsHelper.GetValue<string>(reader[ctr]), null);
            }
            //add item to list
            result.Add(item);
        }

        reader.Close();
        reader.Dispose();

        return result;
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消