为什么else分支没有被执行?

时间:2011-12-09 20:32:29

标签: c#

这实际上是一个有效的应用程序。虽然没有太多的错误捕获方式。

我只是想记录流程,但是没有到达If分支或else分支。 我该怎么做才能实现这一目标?分支的任何一方都没有登录我的txt文件。

while (reader.Read())
{
    if (reader.HasRows)
    {
        LogMessage("Further Inside Try2 ");
        byte[] paymentData = (byte[])reader["payment"];
        strPaymentData = ASCIIEncoding.Unicode.GetString(paymentData);
        LogMessage(strPaymentData + " strPaymentData");
    }
    else
    {
        LogMessage("Payment Retrievlal Failed ");
    }
}

6 个答案:

答案 0 :(得分:11)

如果您在reader.read()中使用,则无需检查读者是否有行。如果reader没有返回任何行,则while循环将不会执行。因此,如果读者没有行,则永远不会达到else。

您可以按如下方式重写代码:

if (reader.HasRows)
{
    while (reader.Read())
    {    
        LogMessage("Further Inside Try2 ");
        byte[] paymentData = (byte[])reader["payment"];
        strPaymentData = ASCIIEncoding.Unicode.GetString(paymentData);
        LogMessage(strPaymentData + " strPaymentData");
    }
}
else
{
    LogMessage("Payment Retrievlal Failed ");
}

答案 1 :(得分:7)

如果没有要读取的行,

reader.Read()会返回false。因此,如果您想要对没有返回的行进行特殊处理,则需要将该检查移到while之外:

    if (reader.HasRows())
    {
        while (reader.Read())
        {
            LogMessage("Further Inside Try2 ");
            byte[] paymentData = (byte[])reader["payment"];
            strPaymentData = ASCIIEncoding.Unicode.GetString(paymentData);
            LogMessage(strPaymentData + " strPaymentData");
        }
    }
    else
    {
        LogMessage("Payment Retrievlal Failed ");
    }

现在,如果你知道只返回最多1行(比如读取主键),你可以简化代码只需放{{1而在reader.Read()内改为:

if

答案 2 :(得分:2)

如果只是成功读取了一行,那么显然至少有一行,因此HasRows将返回true。将HasRows测试移到外面

答案 3 :(得分:2)

如果您未到达两个分支中的任何一个,则必须是因为reader.Read())返回false。我没有看到另一种方法来实现它。

答案 4 :(得分:0)

您的reader.Read()调用很可能发现没有行,因为文件由于某种原因未打开或为空。因此,在读取后检查新的HasRows不能按预期工作。

答案 5 :(得分:0)

颠倒逻辑:

if (reader.HasRows)
{
  while (reader.Read())
  {
     //Process a row
  }
else
{
     LogMessage("Payment Retrievlal Failed "); 
}