我有DataReader来保存存储过程caal的结果。结果包括两个领域......
UserID
UserName
通常我将这些结果绑定到ASP.NET下拉列表控件...
ddlUserList.DataSource = rdr // rdr is the DataReader
ddlUserList.DataTextField = "UserName"
ddlUserList.DataValueField = "UserID"
ddlUserList.DataBind()
但是我现在正在尝试使用jQuery AJAX完成同样的事情。我坚持的是如何手动将DataReader中保存的数据集转换为JSON。多个值如何分开?这看起来是否正确?
{{"UserID":1, "UserName":"Bob"}, {"UserID":2, "UserName":"Sally"},{"UserID":3, "UserName":"Fred"}}
我意识到有一些库,比如JSON.NET来处理序列化,但我现在处于学习阶段,并希望确保我从头到底了解所有内容。
答案 0 :(得分:2)
想知道您是否尝试过使用System.Web.Script.Serialization.JavaScriptSerializer库?
你可以看看Rick Stahl的博客: http://www.west-wind.com/weblog/posts/737584.aspx
或者你也可以做一些事情,比如创建一个从datareader中提取数据并将其放在对象列表中的方法。 (见下面的代码)。这些对象列表将使用JavaScriptSerializer库进行序列化。
希望这有帮助!
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;
}
}