我使用的是 SqlDataReader
来从存储过程中获取数据。即使记录正在被取回,也会被称为 while (reader.Read())
只被执行一次,所以在我的列表中只增加了一行。
List<Student> tablelist = new List<Student>();
using (SqlConnection con = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand("SP_ReadPromotedStudents"))
{
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = Data[0];
cmd.Parameters.Add("@Email", SqlDbType.VarChar).Value = Data[1];
cmd.Parameters.Add("@Class", SqlDbType.VarChar).Value = Data[2];
con.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.HasRows)
{
while (reader.Read())
{
tablelist.Add(new Student
{
Name = (string)(reader[0]),
Email = (string)(reader[1]),
Class = (string)(reader[2]),
});
reader.NextResult();
}
}
}
}
}
return tablelist;
我的 Student
类。
public class Student
{
public string Name { get; set; }
public string Email { get; set; }
public string Class { get; set; }
}
我有大约46条记录正在被提取。但在列表中只有一条记录被添加。这里的错误是什么?
你需要把你的电话转移到 NextResult
外界 reader.Read()
循环。否则在第一次读取后,代码遇到了 NextResult
调用,并尝试加载存储过程返回的第二组数据。
同时 循环往复 HasRows
是一个无限循环. 如果该财产 reader.HasRows
是真的,当你完成读取行时,它也将是真的。
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
tablelist.Add(new Student
{
Name = (string)(reader[0]),
Email = (string)(reader[1]),
Class = (string)(reader[2]),
});
}
// This should be called only if your stored procedure returns
// two or more sets of data otherwise you can remove everything
reader.NextResult();
// If there is another set of data then you can read it with a
// second while loop with
while(reader.Read())
{
.....
}
}
理想的情况是有一个新的sql语句来获取你想要的东西,而不是获取一个列表,只需要第一个访问。想象一下,如果你有一个有几百万条记录的表,你是否需要执行一个查询来获取所有记录,然后只读取第一条记录?不,你执行一个查询来获取你需要的东西。
列表中的 NextResult
方法从 DataReader
将指针移动到下一个结果,如果你在结果上有它的话。移除它。
当你改变sql语句以获得你所需要的东西后,你正在循环结果集。你可以只读第一行(改变第一行的 while
到 if
):
if (reader.Read())
{
tablelist.Add(new Student
{
Name = (string)(reader[0]),
Email = (string)(reader[1]),
Class = (string)(reader[2]),
});
}