我收到此错误(并非所有代码路径都返回值)。我想用唯一键约束在我的数据库中插入数据。但是当我在我的代码中添加它时,我的方法给了我这个错误。
这是我的代码
public string Insert()
{
SqlConnection Conn = new SqlConnection(@"Data Source=ZARAK\SQLEXPRESS;Initial Catalog=ProjectDAL;integrated security=true");
try
{
Conn.Open();
SqlCommand cmd = new SqlCommand("Insert INTO tbl_User(Name,Email,Password) VALUES ('" + name + "','" + email + "','" + password + "')", Conn);
int restl = cmd.ExecuteNonQuery();
//temp = true;
return "Record Inserted successfully!";
}
catch (SqlException ex)
{
if (ex.Number == 2627)
{
return "Record Already Exists";
}
}
finally
{
Conn.Close();
}
}
答案 0 :(得分:8)
你的问题在这里:
catch (SqlException ex)
{
if (ex.Number == 2627)
{
return "Record Already Exists";
}
// **
}
如果查看应用程序的代码路径,每个if
也会隐式添加else
。在这种情况下,else
不包含return
语句,因此错误。
然后有例外......
处理特殊情况的例外情况。软件开发人员之间存在这种隐含的协议,catch
暗示正确处理它。
处理它的一种方法是通知用户记录已经存在(我猜这就是你做的)。如果发生了其他事情,通知用户错误并不总是有效的;你可能只想在几秒钟内再次尝试(死锁)或做其他事情。通常你会在更高级别上处理类似的代码,并让异常涟漪。
结果,我不能告诉你**的代码需要什么;你需要根据你想要达到的目标自己决定。
例如:
catch (SqlException ex)
{
if (ex.Number == 2627)
{
return "Record Already Exists"; // user needs to do something
}
// We don't want to handle the rest here:
throw;
}
答案 1 :(得分:2)
在您的代码中可能的代码路径是
=>Try=>finally=> Exit
=>catch=>ex.Number == 2627=>finally=>Exit
=>catch=>ex.Number != 2627=>finally=>Exit
通过你的代码你已经处理了前两个;如果编译器遇到第三个条件,它将会知道该怎么做,这就是它出现这种错误的原因。
这可以通过处理第三个代码路径(ex.Number != 2627
)来解决。现在考虑以下代码:
catch (SqlException ex)
{
if (ex.Number == 2627)
{
return "Record Already Exists";
}
return "Some other error occurred";
}
您需要注意的另一件事是纯文本查询。哪一个 将为SQL Injection打开一扇大门。所以我请你使用 parameterized queries
包括所有这些更改,Insert()
的方法签名将如下所示:
public string Insert()
{
// Assuming Name email and passwords are global variables
// Or else need to get them
string conStr = @"Data Source=ZARAK\SQLEXPRESS;Initial Catalog=ProjectDAL;integrated security=true";
int queryResult = 0;
try
{
string querySQL = "Insert INTO tbl_User(Name,Email,Password)VALUES(@name,@email,@password)";
using (SqlConnection Conn = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(querySQL, Conn))
{
cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = Name;
cmd.Parameters.Add("@email", SqlDbType.VarChar).Value = email;
cmd.Parameters.Add("@password", SqlDbType.VarChar).Value = password;
queryResult= cmd.ExecuteNonQuery();
}
}
return queryResult + "Record/s Inserted successfully!";
}
catch (SqlException ex)
{
if (ex.Number == 2627)
{
return "Record Already Exists";
}
return "Some other error";
}
}
答案 2 :(得分:1)
将代码更改为此内容以确保您有返回值。
public string Insert()
{
var result = String.Empty;
SqlConnection Conn = new SqlConnection(@"Data Source=ZARAK\SQLEXPRESS;Initial Catalog=ProjectDAL;integrated security=true");
try
{
Conn.Open();
SqlCommand cmd = new SqlCommand("Insert INTO tbl_User(Name,Email,Password) VALUES ('" + name + "','" + email + "','" + password + "')", Conn);
int restl = cmd.ExecuteNonQuery();
//temp = true;
result = "Record Inserted successfully!";
}
catch (SqlException ex)
{
if (ex.Number == 2627)
{
result = "Record Already Exists";
}
else {
result = ex.Message; // For other exceptions
}
}
finally
{
Conn.Close();
}
return result;
}
答案 3 :(得分:1)
如错误所述,您必须在所有执行路径中返回一个字符串。
public string SomeMethod()
{
try
{
//Path 1
return "Path 1";
}
catch (SqlException ex)
{
if (...) {
//Path 2
return "Path 2";
}
//Path 3
//Return or rethrow.
//return "Path 3";
throw;
}
finally
{
//Clean Up Resources
}
}
答案 4 :(得分:1)
如果您的应用程序抛出异常并且异常编号不等于2627,则您的方法不会返回字符串值。
try
{
Conn.Open();
SqlCommand cmd = new SqlCommand("Insert INTO tbl_User(Name,Email,Password) VALUES ('" + name + "','" + email + "','" + password + "')", Conn);
int restl = cmd.ExecuteNonQuery();
//temp = true;
return "Record Inserted successfully!";
}
catch (SqlException ex)
{
if (ex.Number == 2627)
{
return "Record Already Exists";
}
return "Your Text";
}
finally
{
Conn.Close();
}
return "Your Text";
}
答案 5 :(得分:0)
除 atlaste 之外的其他答案。如果是 C#6.0 ,为了避免此类错误并简化try .. catch
阻止,您可以将异常过滤器:
try {
...
}
catch (SqlException ex) when (ex.Number == 2627) {
return "Record Already Exists";
}
没有if
,没有throw;