2010-05-24 4 views
2

Я получаю сообщение «Недостижимый код обнаружено» в Visual Studio в точке con.close() в моем коде ниже. Можете ли вы определить, что я сделал неправильно?Обнаружен недостижимый код

private int chek1(String insert) 
{ 
    OleDbConnection con = new OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=d:\\sdb.mdb"); 
    OleDbCommand com = new OleDbCommand("select count(*) from sn where sn='" + insert + "\'", con);   
    con.Open(); 

    int po = (int)com.ExecuteScalar();   
    if (po > 0) 
     return 1; 
    else 
     return 0; 
    con.Close();  
} 
+1

Wow еще 2 ответов пока я манипуляция в шахте. – Joshua

+4

Хорошие ответы во всем, но я хочу добавить, что вы могли бы избежать возможности забыть закрыть соединение, если вместо этого использовали 'using'-statement. Это также дает вам безопасность для исключений. Вы можете вернуться из тела с использованием оператора через чудеса компилятора. http://msdn.microsoft.com/en-us/library/yh598w02.aspx – Skurmedel

ответ

7

Ваш код может выглядеть так:

private int check(string sn) 
{ 
    using (OleDbConnection connection = new OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=d:\\sdb.mdb")) 
    using (OleDbCommand command = connection.CreateCommand())   
    { 
     command.CommandText = "SELECT COUNT(*) FROM sn WHERE sn=?"; 
     command.Parameters.Add("@sn", sn)); 
     con.Open();    
     return ((int)com.ExecuteScalar() > 0) ? 1 : 0; 
    } 
} 
+0

Этот код не компилируется. У вас есть паразитный 'if' там ... –

+0

@Drew Noakes: вы просто случайно заметили момент между двумя изменениями – abatishchev

28

Функция завершает работу при возврате 1 или 0 (при возврате ничего, но 1 или 0 в ваш случай); так что не может быть вызвано con.Close().

В коде, который вы опубликовали, вы обязательно вернетесь, поскольку у вас есть оператор return в обеих ветвях вашего оператора if. Если только одна ветка имела оператор возврата, con.Close() все еще может быть достигнут.

Но так или иначе, вы не должны использовать Close - вы должны использовать операторы using.

using (OleDbConnection con = new OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=d:\\sdb.mdb")) 
using (OleDbCommand com = new OleDbCommand("select count(*) from sn where sn='" + insert + "\'", con)) 
{ 
    con.Open(); 

    int po = (int)com.ExecuteScalar();   
    if (po > 0) 
     return 1; 
    else 
     return 0; 

    // con.Close and con.Dispose will be called automatically at the end of the using block 
}  
+0

спасибо, поэтому я должен удалить его, это просто waring not a error – habbo95

+1

@ habbo95, нет, не просто удаляйте его, используйте 'using', как показано Марк. Это автоматически вызовет 'Dispose' на соединение и команду, и удаление соединения закроет его –

+1

@ habbo95, это IS и ошибка, если он никогда не закрывается. «использование» нецелесообразно, поэтому оно закрывает/удаляет соединение. –

4

У вас есть if/else выше, что всегда будет вызывать return:

if (po > 0) 
     return 1; 
    else 
     return 0; 

Таким образом, нет никакой возможности любого кода будет выполняться после этого фрагмента кода.

2
con.Close(); 

недостижим. Любая ветвь оператора if возвращает так, что линия не может быть достигнута.

1
if (po > 0) 
     return 1; 
    else 
     return 0; 

У вас возникли проблемы. Либо po > 0 верен, и в этом случае возвращается 1, либо это не так, и в этом случае возвращается 0. Неважно, con.Close(); никогда не будет выполнен.

2

у вас есть возврат до конца вашей процедуры. он вырвется из этой функции до вызова оператора Close(). просто переместите con.Close() перед вашим if блоком.

1

В дополнение к рассмотрению всех вышеперечисленных ответов лучше рассмотреть возможность использования try..catch..finally и, наконец, закрыть объект соединения. Это будет лучший подход к кодированию. Вы можете улучшить свой код, как это.

private int chek1(String insert) {  
     OleDbConnection con = new OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=d:\\sdb.mdb"); 
     OleDbCommand com = new OleDbCommand("select count(*) from sn where sn='" + insert + "\'", con);  
    try{  
     con.Open(); 

     int po = (int)com.ExecuteScalar();   
     if (po > 0) 
      return 1; 
     else 
      return 0; 
    catch(Exception e){ 
    }finally{ 
     con.Close(); 
    } 
} 
+0

Это будет работать, но использование блоков «использования», как и в других ответах, обычно считается более чистым. – Beska

0

Это будет работать

int po = (int)com.ExecuteScalar();   
int result = 0; 
if (po > 0) { 
    result = 1; 
} 
con.Close(); 
return result; 

в вашем случае con.Close(); не достигается, поскольку функция возвращает ранее

0

Изменить код

private int chek1(String insert) 
{ 
    OleDbConnection con = null; 
    try { 
    con = new OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=d:\\sdb.mdb"); 
    OleDbCommand com = new OleDbCommand("select count(*) from sn where sn='" + insert + "\'", con);   
    con.Open(); 

    int po = (int)com.ExecuteScalar();   
    if (po > 0) 
     return 1; 
    else 
     return 0; 
    } 
    finally { 
     con.Close(); 
    } 
} 
1

Причиной был дан ответ , вы должны посмотреть на использование инструкции using. Он автоматически закроет ваше соединение.

using (OleDbConnection con = new OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=d:\\sdb.mdb")) 
{ 
    using (OleDbCommand com = new OleDbCommand("select count(*) from sn where sn='" + insert + "\'", con)) 
    { 
     con.Open(); 
     int po = (int)com.ExecuteScalar();   
     if (po > 0) 
      return 1; 
     else 
      return 0; 
    } 
} 
+0

Операции 'using' могут быть вложенными для уменьшения отступа – abatishchev

0

Он недостижим, поскольку метод уже возвращает значение перед его выполнением в con.Close методы().

Пожалуйста, измените код в:

using (OleDbConnection con = new OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=d:\\sdb.mdb")) 
{ 
    using (OleDbCommand com = new OleDbCommand("select count(*) from sn where sn='" + insert + "\'", con)) 
    { 
     con.Open(); 

     int po = (int)com.ExecuteScalar(); 

     return po > 0 ? 1 : 0; 
    } 
} 
Смежные вопросы