簡體   English   中英

SqlDataReader 只返回一行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM