我正在用C#开发一个经典的WEBForms应用程序,当我必须对用户进行身份验证时,我使用类似的查询从SQL数据库中读取用户数据:
SELECT userid,username,email,city FROM USERS where username='blablabla' and password='blablabla'
我想在我的方法中使用此sql查询,该方法返回我在DTO
类中定义的UserValue
对象。
我正在考虑使用dataset
来填充执行查询的用户数据
这是正确的方法,还是使用dataset
从查询中读取一行是否过于昂贵和无用?
谢谢
答案 0 :(得分:4)
为了从数据库中获取一条记录或从数据库中逐一记录,“数据读取器”是好方法。检查下面的网站您可以在数据读取器上获得清晰的想法。
http://www.aspdotnet-suresh.com/2012/10/aspnet-difference-between-datareader.html http://msdn.microsoft.com/en-us/library/haa3afyz.aspx http://www.akadia.com/services/dotnet_data_reader.html
答案 1 :(得分:1)
这是一段代码片段(这是针对MS SQL的,但其他类型的SQL应该类似)来说明我在评论中所说的内容:
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
SqlCommand cmd = new SqlCommand("SELECT userid,username,email,city FROM USERS where username=@username and password=@password", con);
cmd.Paramters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@password", password);
cmd.CommandType = CommandType.Text;
UserInfo info = new UserInfo();
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.HasRows)
{
rdr.Read(); // get the first row
info.UserID = rdr.GetInt32(0);
info.UserName = rdr.GetString(1);
info.Email = rdr.GetString(2);
info.City = rdr.GetString(3);
}
}
}
此示例还说明了如何进行参数化查询,这对于防止SQL注入攻击至关重要。
此外,我不是通过阅读器循环,而是检查它是否有行,如果是,我只读第一行(因为你处理用户信息,理论上应该只有一行)并填充DTO。
希望这能说明我对你的问题的评论。