首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法进入(具有OleDbDataReader对象的) c#中的while循环

无法进入(具有OleDbDataReader对象的) c#中的while循环
EN

Stack Overflow用户
提问于 2013-05-01 02:25:11
回答 1查看 702关注 0票数 0

请检查代码中间的注释,它显示了问题所在,以及我如何尝试解决它。谢谢!

问题出在以下语句中:"while ((ObjReader.Read()) && (counter <= 5))“。我设置了一个断点,但是光标就是不想进入while循环!我尝试在该语句的正上方编写:"ObjReader.Read()“,它可以正常地读取它,但它不想在while循环中读取它……

代码语言:javascript
复制
    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();
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-01 02:29:31

您的查询可能返回零行。这将导致Read()返回false。在处理时间间隔时,很容易向后返回并得到零行。问题是您有两个不同的时间值,并且您将它们与同一列进行比较。一列永远不能同时等于两个不同的值!所以,你得到的是零行。此外,尽量避免在查询中使用*-只列出需要的列,并节省网络开销。

您的查询可能需要是范围查询,而不是等于...

代码语言:javascript
复制
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“来强制零行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16306580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档