【问题标题】:How to get more than one record using SqlDataReader?如何使用 SqlDataReader 获取多条记录?
【发布时间】:2015-09-04 05:53:09
【问题描述】:

这是我的网络方法,我想在我的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() 并且连接超时

【问题讨论】:

  • DefMeetingDTO d = new DefMeetingDTO();移动到内循环
  • 使用 reader.NextResult() 有什么目的。你是在执行两个查询吗?
  • 不是只有 1 个查询,但是 reader 只运行了 1 次然后出去然后再次运行并返回第 1 条记录 10 次然后连接超时

标签: c# asp.net .net sql-server visual-studio


【解决方案1】:

我不确定您为什么使用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。

【讨论】:

  • 但同样的问题阅读器在读取第一条记录后移出到 if(reader.hasrows) 然后再次运行,而不是 secod 再次返回第一条记录
  • @office302 - 你还在do 循环中这样做吗?完全删除它不是必需的。此外,HasRows 不是必需的。
  • 我删除了其中的大部分,但我的 while 语句仍然不会进入下一条记录
【解决方案2】:

我认为您正在 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());  

【讨论】:

  • SELECT d.md_id , d.md_visitor_name , d.md_visitor_cell, d.md_visitor_company , p. purpose_name , m.m_datetime FROM Vms_Meeting M left outer join Vms_MeetingD d on m.M_ID= d.M_ID left outer在 m.Purpose_ID= p. purpose_id WHERE d.M_status='0' 和 m.host_id = 210 上加入 Vms_Purpose p;使用 cmd.executereader
  • 那么就没有必要使用 reader.nextResult。它仅用于批量 sql 语句,其中 reader 将获取多个结果。使用@Rahul Singh 的答案进行操作
  • 但问题仍然是而不是去下一条记录和迭代阅读器移出然后回到while语句,因此仅通过第一条记录进行迭代
  • 移出意味着?控件将去哪里?尝试调试
  • 他放下了,因为没有什么改变像删除 do 和 while 和 if 和 get set acessor dtoclass 声明里面已经在评论中首先定义了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
相关资源
最近更新 更多