这是一个代码片段(这是针对 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。
希望这将说明我对您的问题的评论。