如何使用SqlDataReader获取多个记录

本文关键字:记录 获取 何使用 SqlDataReader | 更新日期: 2023-09-27 18:11:20

这是我的web方法,我想在我的allmeeting列表中添加所有会议,然后我想通过剑道网格返回它并接收

List<DefMeetingDTO> AllDefCompany = new List<DefMeetingDTO>();
List<DefMeetingDTO> f = new List<DefMeetingDTO>();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
    DefMeetingDTO d = new DefMeetingDTO();
    int ji = reader.FieldCount;
    do
    {
         while (reader.Read())
         {
              //for(int i = 0 ; i < ji ; i++) {
              if (!reader.IsDBNull(reader.GetOrdinal("md_id")))
              {
                   d.md_id = Convert.ToInt32(reader["md_id"]) as int? ?? default(int);
              }
              else
              {
                   d.md_id = 0;
              }
              if (!reader.IsDBNull(reader.GetOrdinal("md_visitor_name")))
              {
                   d.md_visitor_name = (string)(reader["md_visitor_name"]);// as DateTime? ?? default(DateTime);
              }
              else
              {
                   // d.m_datetime = null;
              }
              if (!reader.IsDBNull(reader.GetOrdinal("md_visitor_cell")))
              {
                   d.md_visitor_cell = (reader["md_visitor_cell"]).ToString();// as string? ?? default(string);
              }
              if (!reader.IsDBNull(reader.GetOrdinal("md_visitor_company")))
              {
                   d.md_visitor_company = (string)reader["md_visitor_company"];
              }
              if (!reader.IsDBNull(reader.GetOrdinal("purpose_name")))
              {
                   d.purpose_name = (string)reader["purpose_name"];
              }
              if (!reader.IsDBNull(reader.GetOrdinal("m_datetime")))
              {
                   d.m_datetime = Convert.ToDateTime(reader["m_datetime"]) as DateTime? ?? default(DateTime);
              }
              AllDefCompany.Add(d);
          }
     }
     while(reader.NextResult());                        
}

我的SQL查询返回结果为选中的4行

   10878    |   Wasim Riaz  | 0300449436     | Jade | N/A   | NULL
   71123    |   bb          | +9232531256    | F    | mee   | 2015-09-03
   71124    |   CC          | +923218531256  | Fb   | N/A   | 2015-09-03
   71125    |   DD          | +923218531256  | Gb   | N/A   | 2015-09-03

但是SqlDataReader每次只迭代到第一行,而不去第二行添加allmeetinglist(),连接超时

如何使用SqlDataReader获取多个记录

我不知道你为什么使用Do-While循环。您可以像这样简单地使用While循环:-

List<DefMeetingDTO>   AllDefCompany = new List<DefMeetingDTO>();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
    DefMeetingDTO d = new DefMeetingDTO();
    if (!reader.IsDBNull(reader.GetOrdinal("md_id")))
    {
          d.md_id = Convert.ToInt32(reader["md_id"]) as int? ?? default(int);
    }
    else
    {
          d.md_id = 0;
    }
    AllDefCompany.Add(d);
}

请注意,Read()无论如何都会将数据读取器推进到下一个记录,所以没有必要再次使用NextResult。另外,请注意,没有必要检查reader.HasRows,因为如果没有更多的行要获取,Read将返回false。

我想你是在datareader上执行**批处理Transact-SQL语句**。试试下面的代码

  do
    {
       if (reader.HasRows)
         {
             while (reader.Read())
            {
               DefMeetingDTO d = new DefMeetingDTO();
              if (!reader.IsDBNull(reader.GetOrdinal("md_id")))
              {
                   d.md_id = Convert.ToInt32(reader["md_id"]) as int? ?? default(int);
              }
              else
              {
                   d.md_id = 0;
              }
              AllDefCompany.Add(d);
           }
        }
  }
 while(reader.NextResult());