2013-12-09 102 views
0

在調試我的wcf調用它跳過while循環而不讀取內部數據。我一直在通過SO和msdn尋求幫助,似乎沒有什麼突出的。任何人都有什麼線索可以知道我錯過了什麼或者是爲了什麼導致這個循環不能迭代?c#跳過while循環

解決方案:這是一個數據庫問題,一旦我更新了Oracle DB值,查詢在SQL開發人員中運行並且調試在VS2010中運行。

感謝

  using (connection) 
     { 
      try { 
       connection.ConnectionString = connString; 
       OracleCommand command = new OracleCommand(sqlString, connection); 
       connection.Open(); 
       OracleDataReader reader = command.ExecuteReader(); 

       while (reader.Read()) { 

        td.TNAME = reader.IsDBNull(0) ? " " : reader.GetValue(0).ToString(); 

        td.TASK = reader.IsDBNull(1) ? " " : reader.GetValue(1).ToString(); 

        td.STATUS = reader.IsDBNull(2) ? " " : reader.GetValue(2).ToString(); 

        td.COMPLETE = reader.IsDBNull(3) ? " " : reader.GetValue(3).ToString(); 

        td.PRIORITY = reader.IsDBNull(4) ? 0 : Convert.ToInt32(reader.GetValue(4)); 

        tl.Add(td); 
       } 
      //while (reader.NextResult()); 

      reader.Close(); 
      } catch (Exception ex) { 
       myErr = ex.Message; 
      } 
     } 
     return tl; 
+0

什麼是你的查詢語句?只需運行查詢並檢查在Oracle中顯示的記錄數 –

+2

如果它沒有進入'while',我想'reader.Read()'返回'false'。您是否嘗試過調試以查看您是否首先獲得了任何數據?除此之外,'catch'看起來像吞嚥任何異常,除非你在稍後的某個地方檢查'myErr'。例如,你確定你的連接是開放的嗎? – CompuChip

+0

是的SQL語句在SQL Developer中工作,您的權限爲reader.HasRows和reader.Read爲空。我的連接是開放的,但必須是問題所在。謝謝你指出我正確的方向。我也在調查,我會在我糾正這個問題後回覆答案。 thx – atlMapper

回答

0

如果你真的開始while語句不execptions,那麼顯而易見的答案是,你的DataReader沒有數據。嘗試在while循環之前檢查reader.HasRows的值。我想這將是錯誤的。你的sql語句實際上是否在SQL Developer中返回數據?

+0

是的sql語句在SQL Developer中工作,我現在檢查reader.HasRows,謝謝 – atlMapper

0

有兩個可能的原因循環不執行:

  1. 有從之前的循環中的代碼的異常。
  2. reader.Read()不返回任何數據。
0

當然,如果你的循環從不執行,那麼沒有數據從查詢返回,但我看到代碼中有另一個問題。變量td永遠不會被重新初始化,並且在每個循環中,您都會將添加到列表中的相同變量更新爲從當前循環值中提取的值。

所以你最後的循環在你的TL值(無論是)

我想結束了,你應該寫

while (reader.Read()) 
{ 
    td = new YourTDClass(); // Create a new instance of an element of td class 

    td.TNAME = reader.IsDBNull(0) ? " " : reader.GetValue(0).ToString(); 
    td.TASK = reader.IsDBNull(1) ? " " : reader.GetValue(1).ToString(); 
    td.STATUS = reader.IsDBNull(2) ? " " : reader.GetValue(2).ToString(); 
    td.COMPLETE = reader.IsDBNull(3) ? " " : reader.GetValue(3).ToString(); 
    td.PRIORITY = reader.IsDBNull(4) ? 0 : Convert.ToInt32(reader.GetValue(4)); 
    tl.Add(td); 
} 
+0

每次我看到類似'IsDBNull(0)的代碼? ......我渴望一個對付DBNull.Value的空合併運算符。 –