2011-12-09 2 views
4

Это действительно рабочее приложение. Хотя и без особого способа захвата ошибок.Почему ветка else не выполняется?

Я просто пытаюсь зарегистрировать поток и не достигая ни ветви 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 "); 
    } 
} 
+4

вы пытались уйти через код? –

+15

Если ни один из них не достигнут, то ясно, что 'reader.Read()' возвращает значение, которое вычисляется как false. –

ответ

11

Вам не нужно проверять, есть ли у читателя строки, если вы используете while reader.read(). Если читатель не возвращает строки, цикл 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 "); 
} 
+0

Lol, мы оба добавили почти тот же код в одно и то же время ... Смешно! Я тоже +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 ряд вернулся (как чтение на первичный ключ), вы можете упростить код, чтобы просто поставить reader.Read() внутри if вместо:

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

Если у вас есть только успешно считаны ряд, й en ясно, что есть хотя бы 1 ряд, поэтому HasRows вернет true. Перемещение теста HasRows вне «а»

2

Если вы не доходя либо из двух ветвей, он должен быть, потому что reader.Read()) возвращается false. Я не вижу другого способа добиться этого.

0

Вероятно, что ваш ридер reader.Read() обнаруживает, что строк нет, потому что файл по какой-либо причине не открыт или пуст. Поэтому проверка новых HasRows после чтения не работает так, как вы ожидаете.

0

Реверс логика:

if (reader.HasRows) 
{ 
    while (reader.Read()) 
    { 
    //Process a row 
    } 
else 
{ 
    LogMessage("Payment Retrievlal Failed "); 
} 
Смежные вопросы