c#中无法进入while循环(使用OleDbDataReader对象)
本文关键字:使用 OleDbDataReader 对象 循环 while | 更新日期: 2023-09-27 18:11:38
请检查代码中间的注释,它显示了问题在哪里以及我如何尝试解决它…谢谢!
问题在语句中:"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();
}
可能您的查询返回零行。这将导致Read()返回false。在处理时间间隔时,很容易将其倒置并得到零行。问题是你有两个不同的时间值,你将它们与同一列进行比较。一列永远不能同时等于两个不同的值!所以你得到的是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)) ";
请注意,您正在对"strike"列做同样的事情-要求它同时等于两个不同的值-如果这两个值不相同,您将始终获得零行返回。它类似于当我们说"where 1=0"来强制为零行