Обнаружен недоступный код

Я получаю сообщение "Обнаружен недоступный код" в 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;
    }
}
Другие вопросы по тегам