错误:并非所有代码路径都返回值?

时间:2016-06-06 07:16:19

标签: c# sql sql-server-2012

我收到此错误(并非所有代码路径都返回值)。我想用唯一键约束在我的数据库中插入数据。但是当我在我的代码中添加它时,我的方法给了我这个错误。

这是我的代码

  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();
        }
    }

6 个答案:

答案 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)

在您的代码中可能的代码路径是

  1. =>Try=>finally=> Exit
  2. =>catch=>ex.Number == 2627=>finally=>Exit
  3. =>catch=>ex.Number != 2627=>finally=>Exit
  4. 通过你的代码你已经处理了前两个;如果编译器遇到第三个条件,它将会知道该怎么做,这就是它出现这种错误的原因。 这可以通过处理第三个代码路径(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;