[英]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 條記錄被提取。 但是在列表中只添加了一條記錄。 這里有什么錯誤?
您需要將呼叫移至reader.Read()
循環之外的NextResult
。 否則在第一次讀取代碼后遇到NextResult
調用並嘗試加載存儲過程返回的第二組數據。
HasRows
上的循環也是一個無限循環。 如果屬性reader.HasRows
為 true,則在您完成讀取行時也為 true。
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 語句來獲取您想要的內容,而不是獲取一個列表並且只需要第一次訪問。 想象一下,如果您有一個包含數百萬條記錄的表,您是否需要執行查詢來獲取所有記錄並只讀取第一條記錄? 不,您執行查詢以獲得所需的信息。
DataReader
中的NextResult
方法將指針移動到下一個結果(如果結果上有)。 去掉它。
在更改 sql 語句以獲得所需內容后,您將循環結果集。 您可以只閱讀第一行(將while
更改為if
):
if (reader.Read())
{
tablelist.Add(new Student
{
Name = (string)(reader[0]),
Email = (string)(reader[1]),
Class = (string)(reader[2]),
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.