2013-04-30 2 views
0

코드 중간에 주석을 확인하십시오. 문제가있는 곳과 해결 방법을 표시하십시오.OleDbDataReader 개체를 사용하여 while 루프를 C#으로 처리 할 수 ​​없습니다.

문제는 "while ((ObjReader.Read()) & & (카운터 < = 5))"문 내에 있습니다. 중단 점을 넣었지만 커서는 while 루프에 들어가기를 원치 않습니다 !! 난 그냥 그 문 위에 쓰기 위해 노력했다 "ObjReader.Read()"를 자체 및 아마

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())'가 작동하기 만하면됩니까? –

답변

1

... 그것은 일반적으로 그것을 읽지 만이 while 루프에서 그것을 읽고 싶어하지 않습니다 귀하의 쿼리가 0 행을 반환합니다. 그러면 Read()가 false를 반환합니다. 시간 간격을 다룰 때, 뒤로 간격을 두어 0 행을 얻는 것은 매우 쉽습니다. 문제는 서로 다른 두 개의 시간 값을 갖고 있고, 두 개의 값을 같은 열과 비교하고 있다는 것입니다. 한 열은 동시에 두 개의 서로 다른 값과 같을 수 없습니다! 그래서, 다시 0 행을 얻고 있습니다. 또한 쿼리에서 *를 사용하지 마십시오. 필요한 열만 나열하고 네트워크 오버 헤드를 줄일 수 있습니다.

조회에 아마 RANGE 쿼리가 아닌 동등 할 필요가

... 당신은 "파업"열이 같은 일을하고있는

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)) "; 

주 - 그것을 필요로하는 두 개의 동일하게 동시에 다른 값 - 두 값이 같지 않으면 항상 0 행이 반환됩니다. 우리가 "1 = 0"이라고 말하면 제로 행이됩니다.

+0

나는 당신이 의미하는 것을 얻는다. 실제로 시간은 t = 1, 2, 3, ...과 같은 데이터베이스에서 이산 적이다. – Mike

+0

물론, 시간을 저장하는 좋은 방법이지만, 쿼리는 기본적으로 "모두 찾기 시간이 한 값과 같고 다른 값과 동일한 행 "이 항상 거짓입니다. where 절의 조건은 한 번에 한 행에서 작동한다는 점에 유의하십시오. – Jasmine

+0

방금 ​​쿼리를 변경했습니다. 대괄호 안에 AND 대신 OR를 넣었습니다 ... 행을 읽었습니다. 그것이 올바른 방법인가요? – Mike