SqlDataReader只返回一行

问题描述 投票:0回答:2

我使用的是 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条记录正在被提取。但在列表中只有一条记录被添加。这里的错误是什么?

c# sql-server sqldatareader datareader
2个回答
2
投票

你需要把你的电话转移到 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())
    {
        .....
    }
}

0
投票

理想的情况是有一个新的sql语句来获取你想要的东西,而不是获取一个列表,只需要第一个访问。想象一下,如果你有一个有几百万条记录的表,你是否需要执行一个查询来获取所有记录,然后只读取第一条记录?不,你执行一个查询来获取你需要的东西。

列表中的 NextResult 方法从 DataReader 将指针移动到下一个结果,如果你在结果上有它的话。移除它。

当你改变sql语句以获得你所需要的东西后,你正在循环结果集。你可以只读第一行(改变第一行的 whileif):

if (reader.Read())
{
   tablelist.Add(new Student
   {
     Name = (string)(reader[0]),
     Email = (string)(reader[1]),
     Class = (string)(reader[2]),
   });
}
© www.soinside.com 2019 - 2024. All rights reserved.