C# 错误:不是所有代码路径都返回值?
我得到了这个错误(不是所有的代码路径都返回一个值)。我想在数据库中插入具有唯一键约束的数据。但是当我在代码中添加这个时,我的方法给了我这个错误 这是我的密码C# 错误:不是所有代码路径都返回值?,c#,sql,sql-server-2012,C#,Sql,Sql Server 2012,我得到了这个错误(不是所有的代码路径都返回一个值)。我想在数据库中插入具有唯一键约束的数据。但是当我在代码中添加这个时,我的方法给了我这个错误 这是我的密码 public string Insert() { SqlConnection Conn = new SqlConnection(@"Data Source=ZARAK\SQLEXPRESS;Initial Catalog=ProjectDAL;integrated security=true");
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();
}
}
你的问题是:
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;
}
将您的代码改为此,以确保您有一个返回值
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;
}
在代码中,可能的代码路径是
=>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注入打开一扇大门。所以我请求你使用
包括所有这些更改,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";
}
}
在错误状态下,必须在所有执行路径中返回字符串
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
}
}
如果应用程序引发异常,并且异常数不等于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";
}
除了atlaste很好的回答之外。在C#6.0的情况下,为了避免此类错误并简化try。。catch
阻止您可以放置异常筛选器:
无
如果
,则无抛出代码>您的异常不会在每种情况下都返回一个值。请在finally块中返回一个字符串。如果您得到一个异常,并且异常编号不是2627,您的方法将返回什么?如果在try块或ex.number不是2627中返回之前得到异常,该怎么办?在方法结束之前返回一些值将删除错误。因此,我必须添加一个else语句?@ZarakDawood,是的,或者只返回一个return“Exception ocurred”代码>在if
块之外。或者不返回字符串,让异常
抛出。在这种情况下,您并没有真正处理异常
;既然你不是,我也不会假装通过返回字符串来处理它代码>而不是返回字符串。@ColinZabransky Yea这就是我刚才写的:-)更重要的是:不要做抛出ex代码>;使用throw代码>。否则您将丢失信息。我希望用户在尝试插入多封电子邮件时收到错误。我为电子邮件添加了一个唯一的密钥约束,但它不起作用?我该怎么办?
try {
...
}
catch (SqlException ex) when (ex.Number == 2627) {
return "Record Already Exists";
}