Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 错误:不是所有代码路径都返回值?_C#_Sql_Sql Server 2012 - Fatal编程技术网

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";
      }