2013-04-30 76 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