2013-04-30 81 views
0

請檢查在代碼中間發表的評論,它顯示了問題在哪裏,以及我如何解決它...謝謝!無法進入while循環在c#中(與一個OleDbDataReader對象)

問題出現在聲明中:「while((ObjReader.Read())& &(counter < = 5))」。我把一個斷點,但光標只是不想進入while循環!我曾經試着寫只是上述聲明:「ObjReader.Read()」對自己和它正常讀取它,但它不希望在while循環讀取它...

public static void Convert(OleDbConnection MyConn, double strike1_run, double time0_run) 
    { 

     string value1 = ""; 
     string value2 = ""; 
     string value3 = ""; 
     string T0 = ""; 
     string T1 = ""; 
     string VolT0K1 = ""; 
     string VolT1K1 = ""; 
     string K0 = ""; 
     string K1 = ""; 
     string K2 = ""; 
     double DwOverDt; 
     string VolT0K0 = ""; 
     string VolT0K2 = ""; 
     double DwOverDy=0; 
     double DwSqOverDySq = 0; 
     double YoverW = 0; 
     double VarianceLoc = 0; 
     double VolLoc = 0; 

     // create command 
     string StrCmd = "SELECT * FROM Table1 WHERE ((strike = @strike_value0 AND strike = @strike_value1 AND strike = @strike_value2) AND (time= @time_value0 AND time= @time_value1)) "; 

     OleDbCommand Cmd = new OleDbCommand(StrCmd, MyConn); 

     Cmd.Parameters.Add("@strike_value0", OleDbType.VarChar); 
     Cmd.Parameters["@strike_value0"].Value = (strike1_run - 0.01).ToString(); 

     Cmd.Parameters.Add("@strike_value1", OleDbType.VarChar); 
     Cmd.Parameters["@strike_value1"].Value = strike1_run.ToString(); 

     Cmd.Parameters.Add("@strike_value2", OleDbType.VarChar); 
     Cmd.Parameters["@strike_value2"].Value = (strike1_run + 0.01).ToString(); 

     Cmd.Parameters.Add("@time_value0", OleDbType.VarChar); 
     Cmd.Parameters["@time_value0"].Value = time0_run.ToString(); 

     Cmd.Parameters.Add("@time_value1", OleDbType.VarChar); 
     Cmd.Parameters["@time_value1"].Value = (time0_run + 1).ToString(); 

     OleDbDataReader ObjReader = Cmd.ExecuteReader(); // I put a breakpoint here - no issue 

     if (ObjReader != null) // I put a breakpoint here - no issue 
     { 
      int counter = 0; 
      while ((ObjReader.Read()) && (counter <= 5)) //HERE is the problem: I put a breakpoint here, the cursor just doesn't want to enter the while loop !! I have tried to write just above that statement: "ObjReader.Read()" on its own and it reads it normally, but it doesn't want to read it in the while loop ... 
      { 
       value1 = ObjReader.GetValue(1).ToString(); //time column value 
       value2 = ObjReader.GetValue(2).ToString(); //strike column value 
       value3 = ObjReader.GetValue(3).ToString(); //vol column value 
       counter++; 
       Console.WriteLine("counter= " + counter); 

       switch (counter) 
       { 
        case 1: 
         K0 = value2; 
         VolT0K0 = value3; 
         break; 
        case 2: 
         T0 = value1; 
         K1 = value2; 
         VolT0K1 = value3; 
         break; 
        case 3: 
         K2 = value2; 
         VolT0K2 = value3; 
         break; 
        case 4: 
         break; 
        case 5: 
         T1 = value1; 
         VolT1K1 = value3; 
         Console.WriteLine("Time: " + T0 + " - " + T1 + "\n" + "Strike: " + K0 + " - " + K1 + " - " + K2 + "\n" + "Vol: " + VolT0K1 + " - " + VolT1K1); 
         break; 
        default: 
         break; 
       } 
      } 
     } 
     ObjReader.Close(); 
    } 
+0

只要確定:如果你刪除了&&(counter <= 5)),那麼'while(ObjReader.Read())'可以工作嗎? – 2013-04-30 18:29:47

回答

1

可能您的查詢返回零行。這將導致Read()返回false。處理時間間隔時,很容易將其倒退並獲得零行。問題是你有兩個不同的時間值,你將它們與同一列進行比較。一列不能同時等於兩個不同的值!所以,你得到了零排。另外,儘量避免在查詢中使用*,只列出您需要的列並節省網絡開銷。

您的查詢可能需要一個範圍查詢,而不是一個等號...

string StrCmd = "SELECT time, strike, vol FROM Table1 WHERE ((strike = @strike_value0 AND strike = @strike_value1 AND strike = @strike_value2) AND (time >= @time_value0 AND time <= @time_value1)) "; 

請注意,您在做同樣的事情用「罷工」列 - 要求它等於2同時有不同的值 - 如果這兩個值不相同,您將始終返回零行。這與當我們說「where 1 = 0」強制零行時類似。

+0

我明白你的意思了......實際上我的數據庫中的時間是離散的,例如t = 1,2,3 ...... – Mike 2013-04-30 18:39:12

+0

當然,這是存儲時間的好方法,但是你的查詢基本上是說「find all時間等於一個值並且等於另一個值的行「,這總是假的。請記住where子句中的條件一次對一行進行操作。 – Jasmine 2013-04-30 18:41:33

+0

我只是改變了我的查詢:我已經把OR放在括號內,而現在它正在讀取行。這是做這件事的正確方法嗎? – Mike 2013-04-30 18:42:56