Обнаружен недоступный код - PullRequest
2 голосов
/ 24 мая 2010

Я получаю сообщение «Обнаружен недоступный код» в 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 ]

28 голосов
/ 24 мая 2010

Функция завершается, когда вы возвращаете 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
}      
7 голосов
/ 24 мая 2010

Ваш код может быть таким:

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;
    }
}
4 голосов
/ 24 мая 2010

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

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

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

2 голосов
/ 24 мая 2010

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

2 голосов
/ 24 мая 2010
 con.Close();

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

1 голос
/ 24 мая 2010

Причина, по которой был дан ответ, вы должны посмотреть, используя оператор 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;
    }
}
1 голос
/ 24 мая 2010

В дополнение к рассмотрению всех приведенных выше ответов, лучше рассмотреть возможность использования 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();
    }
}
1 голос
/ 24 мая 2010
    if (po > 0)
        return 1;
    else
        return 0;

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

0 голосов
/ 25 мая 2010

Он недоступен, потому что метод уже возвращает значение перед выполнением метода 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;
    }
}
0 голосов
/ 24 мая 2010

Измените свой код на

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();
    }
}
...