返回数据集值给出错误

Posted

技术标签:

【中文标题】返回数据集值给出错误【英文标题】:Returning dataset values giving an error 【发布时间】:2013-08-14 06:04:38 【问题描述】:

我定义了以下函数,它将从表中返回 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()':并非所有代码路径都返回值

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案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。另一个问题是,如果抛出异常,您不会返回值。当抛出异常时,您将断开连接并且不返回任何值。

【讨论】:

【参考方案3】:

这是因为没有返回路径的情况:-DB_SUCCESS_CONNECT != iRet

【讨论】:

返回在try - catch :)【参考方案4】:

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

添加:

return ds;

在你的函数末尾的 catch 块之后。

【讨论】:

【参考方案5】:

try 块中只有 return 语句,由于编译器假定的异常,不能保证它总是会执行。添加另一个 return 语句返回 nulldataset out of try 那么你不会得到错误。您只能有一个 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;

【讨论】:

最后一个return null就够了:) 感谢您的指点,只有一个回报就足够了,而不是你有两个。【参考方案6】:

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

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

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;

【讨论】:

【参考方案7】:

trycatch 块之后放置return 语句,试试下面的代码:

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块的返回值

【讨论】:

以上是关于返回数据集值给出错误的主要内容,如果未能解决你的问题,请参考以下文章

如何将指数平滑模型预测值获取到 POWER BI/POWER Query 数据集?

熊猫使用 loc 更改特定行的数据集值

函数中返回参数的数据位置必须是“内存”,但没有给出

SqlDataAdapter.Fill 方法不会给出任何错误,但也不会返回任何数据以用于长时间运行的查询 ado.net core SQL Server

雪花存储在使用抛出错误而不是返回错误时给出不同的错误

返回 malloc 的结构会给出段错误和不同的地址