我有一个MyTest.aspx.cs
和一个名为MyTestClass.cs
的班级。
请参阅以下MyTestClass.cs
的代码。它给了我关于Unreachable code detected
的警告。它在con
con.Close();
一词
我的程序运行正常,我只是对这种警告感到不安。我研究了它,我尝试了我在互联网上发现但它不起作用。我想我在这里错过了一些东西。
public string Insert_Data(string NewCol1 , string NewCol2, string NewCol3, string NewCol4, double NewCol5)
{
con.Open();
string CheckString = @"SELECT COUNT(*) FROM my_table " +
"WHERE col1= '" + NewCol1 + "' " +
"and col2= '" + NewCol2 + "' " +
"and col3= '" + NewCol3 + "' " +
"and col4= '" + NewCol4 + "' ";
cmd = new SqlCommand(CheckString,con);
int Count = (int)cmd.ExecuteScalar();
if (Count > 0)
{
return "Record Already Exists.";
}
else
{
cmd = new SqlCommand("INSERT INTO my_table (col1,col2,col3,col4,col5,getupdateDate) " +
" VALUES('" + NewCol1+
"','" + NewCol2+
"','" + NewCol3 +
"','" + NewCol4+
"'," + NewCol5+ ", GETDATE())", con);
int temp = cmd.ExecuteNonQuery();
return "Inserted Sucessfully";
}
con.Close();
}
答案 0 :(得分:5)
在你的片段中看到你有两个代码路径,一个是通过if而另一个是通过else,你在两个路径中都有return
个语句,所以else块之后的代码将不会被执行,那就是错误消息告诉。你有几个选择来解决这个问题。
最佳选择:
public string Insert_Data(string NewCol1 , string NewCol2, string NewCol3, string NewCol4, double NewCol5)
{
try
{
// your code here
if (Count > 0)
{
return "Record Already Exists.";
}
else
{
// code here
return "Inserted Sucessfully";
}
}
catch
{
return "Error occured";
}
finally
{
con.Close();
}
}
如果你不想使用try..catch意味着你可以这样使用:
public string Insert_Data(string NewCol1 , string NewCol2, string NewCol3, string NewCol4, double NewCol5)
{
string resultMessage;
// your code here
if (Count > 0)
{
resultMessage = "Record Already Exists.";
}
else
{
// code here
resultMessage = "Inserted Sucessfully";
}
con.Close();
return resultMessage;
}
答案 1 :(得分:0)
是的,这是一个问题。 if
语句的两个分支都有return
个语句,因此con.Close()
永远不会执行,不关闭连接是件坏事。
解决此问题的一种方法是使用try...finally
。此外,您应该确保创建连接的代码在不再需要时处理它(通常这样做的方法是使用using
块。
请注意,请花点时间阅读有关SQL注入和参数化查询的内容。使用字符串连接构建SQL查询的方法是 BAD 。
public string Insert_Data(string NewCol1 , string NewCol2, string NewCol3, string NewCol4, double NewCol5)
{
try
{
con.Open();
string CheckString = @"SELECT COUNT(*) FROM my_table " +
"WHERE col1= '" + NewCol1 + "' " +
"and col2= '" + NewCol2 + "' " +
"and col3= '" + NewCol3 + "' " +
"and col4= '" + NewCol4 + "' ";
cmd = new SqlCommand(CheckString,con);
int Count = (int)cmd.ExecuteScalar();
if (Count > 0)
{
return "Record Already Exists.";
}
else
{
cmd = new SqlCommand("INSERT INTO my_table (col1,col2,col3,col4,col5,getupdateDate) " +
" VALUES('" + NewCol1+
"','" + NewCol2+
"','" + NewCol3 +
"','" + NewCol4+
"'," + NewCol5+ ", GETDATE())", con);
int temp = cmd.ExecuteNonQuery();
return "Inserted Sucessfully";
}
}
finally
{
con.Close();
}
}
答案 2 :(得分:0)
现有答案可以正确识别您询问的问题。但是,这里有一个更大的问题:
编译器几乎从不会出现此类警告。因此,如果你收到警告并且你不期望它几乎肯定意味着你的代码正在做你不打算做的事情 - 这几乎肯定意味着你有一个bug。
我发现只有两种方法可以使编译器发出错误警告:
它并不理解两个条件是相同的测试,因此不会考虑第一个条件中的代码在第二个条件中运行。修复:为相关变量提供虚假初始化 - 最好使用不起作用的值。
它并不了解一组协同工作何时涵盖了所有可能的情况并且会认为执行可能会失败。修复:提供虚假返回或抛出异常。
编辑:有一种情况是它无法理解它无法达到它:Trace.Assert之后的代码(false);虽然这看起来很愚蠢我现在正在看一个 - 方法应该是抽象但这意味着这个类必须是抽象的 - 而且它是父的一些表单,Visual Studio本身将实例化它。因此,Visual Studio不会立即调用的所有抽象方法都会抛出。