Обнаружен недоступный код
Я получаю сообщение "Обнаружен недоступный код" в 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();
}
11 ответов
Ваш код может быть таким:
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;
}
}
Функция завершается, когда вы возвращаете 1 или 0 (когда вы возвращаете что-либо, но 1 или 0 в вашем случае); так что нет никакой возможности con.Close()
можно назвать.
В коде, который вы разместили, вы гарантированно вернетесь, так как у вас есть оператор возврата в обеих ветвях вашего оператора 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
}
У вас есть if
/ else
выше этого всегда вызовет return
:
if (po > 0)
return 1;
else
return 0;
Таким образом, невозможно выполнить какой-либо код после этого фрагмента кода.
У вас есть возвращение до конца вашей рутины. она выйдет из этой функции до вызова оператора Close(). просто двигайся con.Close()
до вашего if
блок.
con.Close();
недоступен Любая ветвь оператора if возвращает так, что строка не может быть достигнута.
if (po > 0)
return 1;
else
return 0;
Там твоя проблема. Или po > 0
верно, и в этом случае 1
возвращается, или это не так, и в этом случае 0
возвращается Не важно что, con.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;
}
}
В дополнение к рассмотрению всех приведенных выше ответов, лучше подумайте об использовании 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();
}
}
Измените свой код на
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();
}
}
Это будет работать
int po = (int)com.ExecuteScalar();
int result = 0;
if (po > 0) {
result = 1;
}
con.Close();
return result;
в вашем случае con.Close();
не достигается, потому что функция возвращается раньше
Он недоступен, потому что метод уже возвращает значение до того, как выполнит метод 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;
}
}