SqlDataReader returns 只有一行
SqlDataReader returns only one row
我正在使用 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
class:
public class Student
{
public string Name { get; set; }
public string Email { get; set; }
public string Class { get; set; }
}
我正在提取大约 46 条记录。但是在列表中只添加了一条记录。这里有什么错误?
理想的情况是有一个新的 sql 语句来获取您想要的内容,而不是获取列表并且只需要第一次访问。想象一下,如果您有一个包含数百万条记录的 table,您是否需要执行查询以获取所有记录并只读取第一条记录?不,你执行一个查询来获得你需要的。
DataReader
中的 NextResult
方法将指针移动到下一个结果(如果结果上有它)。删除它。
在更改 sql 语句以获得所需内容后,您正在循环结果集。您可以只阅读第一行(将 while
更改为 if
):
if (reader.Read())
{
tablelist.Add(new Student
{
Name = (string)(reader[0]),
Email = (string)(reader[1]),
Class = (string)(reader[2]),
});
}
您需要将调用移到 reader.Read()
循环之外的 NextResult
。否则在第一次读取代码后遇到 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())
{
.....
}
}
我正在使用 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
class:
public class Student
{
public string Name { get; set; }
public string Email { get; set; }
public string Class { get; set; }
}
我正在提取大约 46 条记录。但是在列表中只添加了一条记录。这里有什么错误?
理想的情况是有一个新的 sql 语句来获取您想要的内容,而不是获取列表并且只需要第一次访问。想象一下,如果您有一个包含数百万条记录的 table,您是否需要执行查询以获取所有记录并只读取第一条记录?不,你执行一个查询来获得你需要的。
DataReader
中的 NextResult
方法将指针移动到下一个结果(如果结果上有它)。删除它。
在更改 sql 语句以获得所需内容后,您正在循环结果集。您可以只阅读第一行(将 while
更改为 if
):
if (reader.Read())
{
tablelist.Add(new Student
{
Name = (string)(reader[0]),
Email = (string)(reader[1]),
Class = (string)(reader[2]),
});
}
您需要将调用移到 reader.Read()
循环之外的 NextResult
。否则在第一次读取代码后遇到 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())
{
.....
}
}