C#SqlDataReader继续阅读

时间:2019-05-06 08:41:53

标签: c# sql sql-server

我有一种从SQL Server数据库中获取数据的方法。我正在使用reader来获取所有数据。问题是reader 不会继续读取,而应用程序不会弹出。就像一个无限循环之类的东西。

public static List<Reservering> GetReserverings()
{
    Reservering res = new Reservering();

    using (var conn = new SqlConnection(ConnectionString))
    {
            conn.Open();
            const string query = "select b.boekingid, k.naam, bk.incheckdatum, bk.uitcheckdatum, b.hotelid, b.aantal_gasten from boeking b join klant k on k.klantid = b.boekingid join boekingkamer bk on b.boekingid = bk.boekingid where bk.incheckdatum is not null and bk.uitcheckdatum is not null";

            SqlCommand selectReserveringen = new SqlCommand(query, conn);

            SqlDataReader reader = selectReserveringen.ExecuteReader();

            while (reader.Read())
            {
                 res.Id =  (int)reader["boekingid"];
                 res.Naam = (string)reader["naam"];
                 res.Incheck_datum = (DateTime)reader["incheckdatum"];
                 res.Uitcheck_datum = (DateTime)reader["uitcheckdatum"];
                 res.Hotel = (int)reader["hotelid"];
                 res.Aantal_personen = (int)reader["aantal_gasten"];
            }

            reader.Close();
        }

        return GetReserverings();
}

有人知道如何解决此问题吗?

3 个答案:

答案 0 :(得分:5)

您可以通过在最后调用方法本身来获得infinite recursion

return GetReserverings();

您可以通过在方法中设置一个断点并逐步执行代码来发现这一点。

您想返回预订列表:

var result = new List<Reservering>();

// your code...

return result;

在您的while()循环中,您希望每次迭代实例化一个新的Reservering,并将其Add实例化到结果列表中。

答案 1 :(得分:1)

您应为每个读取的 记录创建一个Reservering实例,并将这些实例存储在List<Reservering>中:

public static List<Reservering> GetReserverings() {
  List<Reservering> result = new List<Reservering>();

  using (var conn = new SqlConnection(ConnectionString)) {
    conn.Open();

    const string query = 
      @"select b.boekingid, 
               k.naam, 
               bk.incheckdatum, 
               bk.uitcheckdatum, 
               b.hotelid, 
               b.aantal_gasten 
          from boeking b join 
               klant k on k.klantid = b.boekingid join 
               boekingkamer bk on b.boekingid = bk.boekingid 
         where bk.incheckdatum is not null 
           and bk.uitcheckdatum is not null";

     using (SqlCommand selectReserveringen = new SqlCommand(query, conn)) {
       using (SqlDataReader reader = selectReserveringen.ExecuteReader()) {
         while (reader.Read()) {
           Reservering res = new Reservering();
           result.Add(res); 

           res.Id              = Convert.ToInt32(reader["boekingid"]);
           res.Naam            = Convert.ToString(reader["naam"]);
           res.Incheck_datum   = Convert.ToDateTime(reader["incheckdatum"]);
           res.Uitcheck_datum  = Convert.ToDateTime(reader["uitcheckdatum"]);
           res.Hotel           = Convert.ToInt32(reader["hotelid"]);
           res.Aantal_personen = Convert.ToInt32(reader["aantal_gasten"]);  
         }
       } 
     }
   }      

   return result;
}

编辑:您可以借助对象初始化来简化while循环:

     ...
     while (reader.Read()) {
       result.Add(new Reservering() {
         Id              = Convert.ToInt32(reader["boekingid"]),
         Naam            = Convert.ToString(reader["naam"]),
         Incheck_datum   = Convert.ToDateTime(reader["incheckdatum"]),
         Uitcheck_datum  = Convert.ToDateTime(reader["uitcheckdatum"]),  
         Hotel           = Convert.ToInt32(reader["hotelid"]),
         Aantal_personen = Convert.ToInt32(reader["aantal_gasten"]) 
       });
     }

答案 2 :(得分:-1)

public static List<Reservering> GetReserverings()
    {
        List<Reserving> reservings = new List<Reservings>();

        using (var conn = new SqlConnection(ConnectionString))
        {
                conn.Open();
                const string query = "select b.boekingid, k.naam, bk.incheckdatum, bk.uitcheckdatum, b.hotelid, b.aantal_gasten from boeking b join klant k on k.klantid = b.boekingid join boekingkamer bk on b.boekingid = bk.boekingid where bk.incheckdatum is not null and bk.uitcheckdatum is not null";

                SqlCommand selectReserveringen = new SqlCommand(query, conn);

                SqlDataReader reader = selectReserveringen.ExecuteReader();

                while (reader.Read())
                {

                     Reservering res = new Reservering();
                     res.Id =  (int)reader["boekingid"];
                     res.Naam = (string)reader["naam"];
                     res.Incheck_datum = (DateTime)reader["incheckdatum"];
                     res.Uitcheck_datum = (DateTime)reader["uitcheckdatum"];
                     res.Hotel = (int)reader["hotelid"];
                     res.Aantal_personen = (int)reader["aantal_gasten"];
                     reservings.add(res);
                }

                reader.Close();
            }

            return reservings;
    }