C# 并非所有代码路径都返回值错误

C# 并非所有代码路径都返回值错误,c#,C#,如果数据存在,我将读取以下代码。我想返回true或false,但C编译器说:并非所有代码路径都返回一个值,并在方法名ReadDV上显示红色错误行 代码是: public bool ReadDV(string ReadCommand) { try { SqlConnection SCO = ConnectionClass.getconnection(); SqlCommand delCmd = new SqlCommand(ReadCommand,

如果数据存在,我将读取以下代码。我想返回true或false,但C编译器说:并非所有代码路径都返回一个值,并在方法名ReadDV上显示红色错误行

代码是:

public bool ReadDV(string ReadCommand)
{
    try
    {
        SqlConnection SCO = ConnectionClass.getconnection();
        SqlCommand delCmd = new SqlCommand(ReadCommand, SCO);
        if (SCO.State != ConnectionState.Open)
            SCO.Open();
        SqlDataReader r = delCmd.ExecuteReader();

        if (r.Read())
        {
            if (SCO.State != ConnectionState.Closed)
                SCO.Close();

            r.Close();
            return true;
        }
    }
    catch (Exception ex)
    {
        return false;
    }
}
getconnection代码是返回连接字符串的方法的一部分,它工作正常。 我将添加调用此方法的代码的第二部分:read为null时它不起作用

string RUSERSSV = @"select * from USERSSV  where Users = ........;
            DB db = new DB();   // calling method

        if (comboBox1.Text != "")
        {
            if (db.ReadDV(RUSERSSV)==true)  // this is the mention part
            {
                string IUSERSSV = @"update USERSSV set Users =    // insert fired if read is true
                db.insert(IUSERSSV);
                Save.Form(this);
            }
            else
            {
                string IUSERSSV = @"insert into USERSSV  // update fired if read false
                db.insert(IUSERSSV);
                Save.Form(this);
            }

如果返回语句可以执行,也可以不执行,那么应该有一条必须执行的返回语句。如果错误被无条件执行,那么将return放在catch之后可能会删除错误。您可以使用bool变量存储要返回的值并返回该变量

bool success = false;
try
{

    SqlConnection SCO = ConnectionClass.getconnection();
    SqlCommand delCmd = new SqlCommand(ReadCommand, SCO);
    if (SCO.State != ConnectionState.Open) SCO.Open();
    SqlDataReader r = delCmd.ExecuteReader();

    if (r.Read())
    {
        if (SCO.State != ConnectionState.Closed) SCO.Close();
        r.Close();     
        success = true;     
    }
}
catch (Exception ex)
{
    return false;
}
return success;

如果返回语句可以执行,也可以不执行,那么应该有一条必须执行的返回语句。如果错误被无条件执行,那么将return放在catch之后可能会删除错误。您可以使用bool变量存储要返回的值并返回该变量

bool success = false;
try
{

    SqlConnection SCO = ConnectionClass.getconnection();
    SqlCommand delCmd = new SqlCommand(ReadCommand, SCO);
    if (SCO.State != ConnectionState.Open) SCO.Open();
    SqlDataReader r = delCmd.ExecuteReader();

    if (r.Read())
    {
        if (SCO.State != ConnectionState.Closed) SCO.Close();
        r.Close();     
        success = true;     
    }
}
catch (Exception ex)
{
    return false;
}
return success;

将return语句放在if r.Read块之外


基本上,在函数结束之前应该有一个return语句。

将return语句放在if r.Read块之外


基本上,函数结束之前应该有一个return语句。

当ifr.Read为false时,代码没有返回任何内容。 您可以通过以下方式修复代码:

public bool ReadDV(string ReadCommand)
{
    bool returnValue = false;
    try
    {
        SqlConnection SCO = ConnectionClass.getconnection();
        SqlCommand delCmd = new SqlCommand(ReadCommand, SCO);
        if (SCO.State != ConnectionState.Open) SCO.Open();
        SqlDataReader r = delCmd.ExecuteReader();
        if (r.Read())
        {
            if (SCO.State != ConnectionState.Closed) SCO.Close();
            r.Close();
            returnValue = true;
        }
    }
    catch (Exception ex)
    {
        returnValue = false;
    }
    return returnValue;
}

当r.Read为false或捕捉到异常时,上述代码现在总是返回false。

当ifr.Read为false时,代码不会返回任何内容。 您可以通过以下方式修复代码:

public bool ReadDV(string ReadCommand)
{
    bool returnValue = false;
    try
    {
        SqlConnection SCO = ConnectionClass.getconnection();
        SqlCommand delCmd = new SqlCommand(ReadCommand, SCO);
        if (SCO.State != ConnectionState.Open) SCO.Open();
        SqlDataReader r = delCmd.ExecuteReader();
        if (r.Read())
        {
            if (SCO.State != ConnectionState.Closed) SCO.Close();
            r.Close();
            returnValue = true;
        }
    }
    catch (Exception ex)
    {
        returnValue = false;
    }
    return returnValue;
}

当r.Read为false或捕获异常时,上面的代码现在总是返回false。

我建议这样做,这是一个更干净的解决方案,它将防止类似您的问题:

public bool ReadDV(string ReadCommand)
{
    bool result = false;
    try
    {
        SqlConnection SCO = ConnectionClass.getconnection();
        SqlCommand delCmd = new SqlCommand(ReadCommand, SCO);
        if (SCO.State != ConnectionState.Open) SCO.Open();
        SqlDataReader r = delCmd.ExecuteReader();

        if (r.Read())
        {
            if (SCO.State != ConnectionState.Closed) SCO.Close();
            r.Close();
            result = true;
        }
    }
    catch (Exception ex)
    {
        result = false;
    }
    return result;
}

我建议这样做,这是一个更干净的解决方案,它将防止像您这样的问题:

public bool ReadDV(string ReadCommand)
{
    bool result = false;
    try
    {
        SqlConnection SCO = ConnectionClass.getconnection();
        SqlCommand delCmd = new SqlCommand(ReadCommand, SCO);
        if (SCO.State != ConnectionState.Open) SCO.Open();
        SqlDataReader r = delCmd.ExecuteReader();

        if (r.Read())
        {
            if (SCO.State != ConnectionState.Closed) SCO.Close();
            r.Close();
            result = true;
        }
    }
    catch (Exception ex)
    {
        result = false;
    }
    return result;
}
尝试初始化变量中的返回值,然后根据代码路径更改该值,最后只有一个返回语句,这样就不需要有多个返回语句。错误是因为您错过了该函数的return语句-每个可能的代码路径都应该为该函数返回一个值

尝试初始化变量中的返回值,然后根据代码路径更改该值,最后只有一个返回语句,这样就不需要有多个返回语句。错误是因为您错过了该函数的return语句-每个可能的代码路径都应该为该函数返回一个值

我是这样做的:

公共bool ReadDVstring ReadCommand { 布尔结果=假; 尝试 { SqlConnection SCO=ConnectionClass.getconnection; SqlCommand delCmd=新SqlCommandReadCommand,SCO; 如果SCO.State!=ConnectionState.Open SCO.Open; SqlDataReader r=delCmd.ExecuteReader

            if (r.Read()==true)
            {
                if (SCO.State != ConnectionState.Closed) SCO.Close();
                r.Close();
                result = true;
            }

            else if (r.Read() == false)
            {
                if (SCO.State != ConnectionState.Closed) SCO.Close();
                r.Close();
                result = false;
            }
        }
        catch (Exception ex)
        {
            result = false;
        }
        return result;
    }
谢谢大家

我是这样做的:

公共bool ReadDVstring ReadCommand { 布尔结果=假; 尝试 { SqlConnection SCO=ConnectionClass.getconnection; SqlCommand delCmd=新SqlCommandReadCommand,SCO; 如果SCO.State!=ConnectionState.Open SCO.Open; SqlDataReader r=delCmd.ExecuteReader

            if (r.Read()==true)
            {
                if (SCO.State != ConnectionState.Closed) SCO.Close();
                r.Close();
                result = true;
            }

            else if (r.Read() == false)
            {
                if (SCO.State != ConnectionState.Closed) SCO.Close();
                r.Close();
                result = false;
            }
        }
        catch (Exception ex)
        {
            result = false;
        }
        return result;
    }

返回的是r.Read返回false?您忘记了在“if r.Read”的情况下返回true或return false有关更多信息,请阅读它应该返回true谢谢,以下所有答案都可以并删除了我的错误,但在我打电话后,它不起作用返回的是r.Read返回false?您忘记了在else cas中返回true或return false“if r.Read”的e有关更多信息,请阅读它应该返回true谢谢,下面的所有答案都可以,并且删除了我的错误,但在我调用之后,它不起作用。您的代码将方法的行为修改为意外行为,因为即使没有读取数据,它也会返回true。同意。这里应该使用一个标志。我想说的是用户应该在if块之外有一个return语句。这甚至不是真的。如果…{…return true;}否则{return false;},他当然可以这样做我两个都这么做了,但如果数据库没有数据,它将不返回任何内容,我希望读取sql表的2个字段,如果它为null或未找到,则插入已激发的语句,否则更新已激发的语句不确定提供的解决方案为何不起作用。您可以共享更多代码吗?您的代码将方法的行为修改为意外行为,因为它将即使没有读取数据,我也会返回true。同意。这里应该使用一个标志。我想说的是,用户应该在if块之外有一个return语句。这甚至不是真的。如果…{…return true;}或者{return false;}我都这样做了,但是如果数据库
e没有数据,它将不返回任何内容,我希望读取sql上表的2个字段,如果它为null或未找到,则触发insert语句,否则更新FIREDNO不确定提供的解决方案为何不起作用。你能分享更多的代码吗?返回结果;不在if范围内,且返回总是false关于r的内容是什么。读取此返回的内容是什么?返回结果;是的,它总是返回false,如果语句是denaied,它总是返回false,如果语句是denaied,它总是返回false,如果语句是denaied