检测到无法访问的代码

时间:2010-05-24 16:59:44

标签: c# .net ado.net oledb

我在下面的代码中的con.close()处在Visual Studio中收到“无法检测到代码”消息。你能发现我做错了吗?

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 个答案:

答案 0 :(得分:28)

当你返回1或0时(退出任何,但你的情况下为1或0),该函数退出;所以无法调用con.Close()

在您发布的代码中,您可以保证返回,因为您在if语句的两个分支中都有return语句。如果只有一个分支有return语句,则仍然可以访问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
}      

答案 1 :(得分: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;
    }
}

答案 2 :(得分:4)

您的if / else以上会始终触发return

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

因此,在此代码片段之后,任何代码都无法执行。

答案 3 :(得分:2)

 con.Close();

无法访问。 if语句的任何一个分支都返回,以便无法访问该行。

答案 4 :(得分:2)

你在日常工作结束前有一个回报。它会在调用Close()语句之前中断该函数。只需在con.Close()阻止之前移动if

答案 5 :(得分:1)

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

有你的问题。 po > 0为真,在这种情况下返回1,或者不返回0,在这种情况下返回con.Close();。无论如何,{{1}}永远不会被执行。

答案 6 :(得分: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();
    }
}

答案 7 :(得分: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;
    }
}

答案 8 :(得分:0)

这将有效

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

在您的情况下,由于函数早先返回

,因此未达到con.Close();

答案 9 :(得分: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();
    }
}

答案 10 :(得分: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;
    }
}