我有一个问题,我列出了 100 多名学生,但阅读器仅检索表中的最后一个学生。
string selectQuery = "SELECT * FROM Students WHERE firstName = @first AND lastName = @last";
using (SqlCommand sqlCommand = new SqlCommand(selectQuery, sqlConnection))
{
sqlCommand.Parameters.Add("@first", SqlDbType.VarChar);
sqlCommand.Parameters.Add("@last", SqlDbType.VarChar);
foreach (Student student in studentList)
{
sqlCommand.Parameters["@first"].Value = student.first;
sqlCommand.Parameters["@last"].Value = student.last;
}
using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
{
while (sqlReader.Read())
{
Console.WriteLine(sqlReader["firstName"].ToString());
Console.WriteLine(sqlReader["lastName"].ToString());
}
}
}
最佳答案
如果您想检索所有学生的值,那么您需要在foreach Student
循环内执行SQL: p>
string selectQuery = "SELECT * FROM Students WHERE firstName = @first AND lastName = @last";
using (SqlCommand sqlCommand = new SqlCommand(selectQuery, sqlConnection))
{
sqlCommand.Parameters.Add("@first", SqlDbType.VarChar);
sqlCommand.Parameters.Add("@last", SqlDbType.VarChar);
foreach (Student student in studentList)
{
sqlCommand.Parameters["@first"].Value = student.first;
sqlCommand.Parameters["@last"].Value = student.last;
using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
{
while (sqlReader.Read())
{
Console.WriteLine(sqlReader["firstName"].ToString());
Console.WriteLine(sqlReader["lastName"].ToString());
}
}
}
}
但这确实没有多大意义......你真正想要实现什么?您可以按名字和姓氏进行搜索 - 您从 studentList
中提供 - 但随后您也只输出您检索到的名字和姓氏 - 这与相同你已经通过了 - 那么为什么还要访问数据库呢?
更新: 正如 @PatrickArtner 正确评论的那样 - 创建和处置 100 个 SqlDataReader
实例并不理想。最好将此选择过程粘贴到具有单个 SELECT
和 table-valued parameter 的存储过程中。它将保存 100 个(或更多)学生 ID 或信息,您可以根据这些 ID 或信息选择学生,然后使用 单个 从 C# 中的存储过程中迭代结果集SqlDataReader
对象。
关于C# SqlDataReader 仅检索一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48840099/