我在下面的代码中的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();
}
答案 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;
}
}