3

我已经定义了以下函数,它将从表中返回 3 列。

public DataSet GetFunc()
    {
        int iRet = 0;
        DataSet ds = new DataSet();
        SqlConnection sqlConnection = new SqlConnection();
        try
        {
            iRet = connect(ref sqlConnection);
            if (DB_SUCCESS_CONNECT == iRet)
            {
                SqlCommand sqlCommand = new SqlCommand("", sqlConnection);                   
                String strQuery = "Select ID, Did, FirstName from Users";
                sqlCommand.CommandText = strQuery;

                SqlDataAdapter adaptor = new SqlDataAdapter(sqlCommand);
                adaptor.Fill(ds);
                sqlConnection.Close();
                return ds;                    
            }

        }
        catch (Exception e)
        {
            disconnect(ref sqlConnection);
        }
    }

但是当我尝试构建它时,我收到了错误:

错误 172“GetFunc()”:并非所有代码路径都返回值

我很困惑我哪里出错了。有人可以指导我吗?

4

7 回答 7

5

在 try 块中您已经给出了返回类型,而在 catch 块中没有返回类型。当编译器没有找到合适的返回值时,通常会发生此错误。尝试在 catch 中返回 ds

但是请确保在您的逻辑中进一步检查 ds 以进行空检查

于 2013-08-14T06:07:53.903 回答
2
public DataSet GetFunc()
{
    int iRet = 0;
    DataSet ds = new DataSet();
    SqlConnection sqlConnection = new SqlConnection();
    try
    {
        iRet = connect(ref sqlConnection);
        if (DB_SUCCESS_CONNECT == iRet)
        {
            SqlCommand sqlCommand = new SqlCommand("", sqlConnection);                   
            String strQuery = "Select ID, Did, FirstName from Users";
            sqlCommand.CommandText = strQuery;

            SqlDataAdapter adaptor = new SqlDataAdapter(sqlCommand);
            adaptor.Fill(ds);
            sqlConnection.Close();
            return ds;                    
        }

    }
    catch (Exception e)
    {
        disconnect(ref sqlConnection);
    }
    return null;
}

并非代码的所有路径都返回值,但必须如此。如果DB_SUCCESS_CONNECT!=iRet你不返回结果。尝试返回一些默认值,可能像上面那样为 null。另一个问题是,如果抛出异常,您不会返回值。抛出异常时,您将断开连接并且不返回任何值。

于 2013-08-14T06:06:20.073 回答
2

您在块中只有 return 语句,try不能保证由于编译器假定的异常,它总是会执行。添加另一个返回nulldatasetout of try 的 return 语句,那么您将不会收到错误。您只能有一个 return 语句,而不是两个或三个。

public DataSet GetFunc()
{
    int iRet = 0;
    DataSet ds = null;
    SqlConnection sqlConnection = new SqlConnection();
    try
    {
        iRet = connect(ref sqlConnection);
        if (DB_SUCCESS_CONNECT == iRet)
        {
            SqlCommand sqlCommand = new SqlCommand("", sqlConnection);                   
            String strQuery = "Select ID, Did, FirstName from Users";
            sqlCommand.CommandText = strQuery;

            SqlDataAdapter adaptor = new SqlDataAdapter(sqlCommand);
            ds = new DataSet();
            adaptor.Fill(ds);
            sqlConnection.Close();                
        }         
    }
    catch (Exception e)
    {
        disconnect(ref sqlConnection);
    }
   return ds;
}
于 2013-08-14T06:06:32.090 回答
2

这是因为万一没有返回路径:-DB_SUCCESS_CONNECT != iRet

于 2013-08-14T06:07:18.760 回答
2

如果在块内抛出异常,try ... catch则没有指定返回值。

添加:

return ds;

在 catch 块之后的函数末尾。

于 2013-08-14T06:07:22.260 回答
1

您的代码失败,因为您仅在条件为真时才返回值。如果条件失败或发生某些异常,则您的方法不会返回任何内容。

另请注意,您没有正确处理连接。您需要关闭或处置连接对象。我会改变你的方法如下

public DataSet GetFunc()
{
    string strQuery = "Select ID, Did, FirstName from Users";
    DataSet ds = new DataSet();
    using (var sqlConnection = new SqlConnection())
    using (var sqlCommand = new SqlCommand(strQuery, sqlConnection))
    using (var adaptor = new SqlDataAdapter(sqlCommand))
    {
        adaptor.Fill(ds);
    }
    return ds;
}
于 2013-08-14T06:27:37.080 回答
1

try在and块之后放置 return 语句catch,尝试使用下面的代码:

public DataSet GetFunc()
{
    int iRet = 0;
    DataSet ds = new DataSet();
    SqlConnection sqlConnection = new SqlConnection();
    try
    {
        iRet = connect(ref sqlConnection);
        if (DB_SUCCESS_CONNECT == iRet)
        {
            SqlCommand sqlCommand = new SqlCommand("", sqlConnection);                   
            String strQuery = "Select ID, Did, FirstName from Users";
            sqlCommand.CommandText = strQuery;

            SqlDataAdapter adaptor = new SqlDataAdapter(sqlCommand);
            adaptor.Fill(ds);
            sqlConnection.Close();                    
        }
    }
    catch (Exception e)
    {
        disconnect(ref sqlConnection);
    }
   return ds;
}

Try如果函数有返回类型,它应该在所有情况下都返回一些东西,所以函数应该有块和块的Catch返回值

于 2013-08-22T12:24:21.317 回答