2015-09-04 43 views
2

这里是我的Web方法我想补充的所有会议,我allmeeting列表,然后我想退货,并通过剑道电网接收如何使用SqlDataReader获取多个记录?

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()和连接时间增加了

+0

举动'DefMeetingDTO d =新DefMeetingDTO();'到内环 –

+2

任何目的的使用** reader.NextResult()**。你执行两个查询吗? – shreesha

+0

不仅1个查询,但读者只运行1次然后再次运行并返回第一条记录10次,然后连接超时 –

回答

7

我不知道你为什么正在使用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()将反正推进DataReader的下一个记录,因此没有必要同NextResult老毛病又犯了。此外,请注意,没有必要检查reader.HasRows,因为如果没有更多行要获取,Read将返回false。

+0

但读取第一条记录后,同样的问题阅读器移出_if(reader.hasrows)_然后再次运行并且而不是secod再次返回第一条记录 –

+1

@ office302 - 你还在做'do'循环吗?完全删除它不是必需的。另外,HasRows不是必需的。 –

+0

我删除了他们的蛾,但仍然是我的while语句不会去下一个记录 –

0

我认为你正在执行批处理** Transact-SQL语句**上datareader.try下面的代码

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()); 
+0

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左外连接Vms_MeetingD d上m.M_ID = d.M_ID左外连接Vms_Purpose p on m.Purpose_ID = p.purpose_id WHERE d.M_status ='0'和m.host_id = 210; 与cmd.executereader –

+1

然后没有必要使用reader.nextResult.it只需要批量sql语句,读者将获取多个result.go与@Rahul Singh的回答 – shreesha

+0

但问题仍然不去下一个记录和迭代读取器移出,然后回到while语句,因此只能通过**第一条记录进行迭代** –