2015-09-04 47 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語句,因此只能通過**第一條記錄進行迭代** –