数据集-并非所有代码路径都返回值

本文关键字:代码 路径 返回值 数据集 | 更新日期: 2023-09-27 18:01:27

我在我的类中公开声明了一个数据集,这是代码

public DataSet GetUsersDataSet()
    {
        SqlConnection con = new SqlConnection(connectionString);
        SqlDataAdapter da = new SqlDataAdapter("SELCT * FROM login", con);
        DataSet ds = new DataSet();
        try
        {
            con.Open(); 
            da.Fill(ds, "login");
            return ds;
        }
        catch 
        { 
            new ApplicationException("Data Error:");
        }
        finally { con.Close(); }

    }

但是它给我错误:

WebApplication1.classes.LoginDB.GetUsersDataSet()':不是所有的代码路径返回一个值

但是在我的代码中,ds正在返回,我在删除try catch之后尝试了一下,当时它很好。谁能说错在哪里?

数据集-并非所有代码路径都返回值

如果try发生故障会发生什么?您需要在try/catch块之外使用return语句。

public DataSet GetUsersDataSet()
{
    SqlConnection con = new SqlConnection(connectionString);
    SqlDataAdapter da = new SqlDataAdapter("SELCT * FROM login", con);
    DataSet ds = new DataSet();
    try
    {
        con.Open(); 
        da.Fill(ds, "login");
    }
    catch 
    { 
        new ApplicationException("Data Error:");
    }
    finally { con.Close(); }
    return ds;
}

想象一下,如果你得到一个异常,你在catch块中没有返回任何东西。所以添加try catch块的返回结束。使用一次返回而不是多次返回。

try
{
   con.Open(); 
    da.Fill(ds, "login");
 }
catch
{
    new ApplicationException("Data Error:");
}
return ds;

你的方法应该返回一个dataset .返回的数据集应该在try-catch语句之外。

public DataSet GetUsersDataSet()
{
    SqlConnection con = new SqlConnection(connectionString);
    SqlDataAdapter da = new SqlDataAdapter("SELCT * FROM login", con);
    DataSet ds = new DataSet();
    try
    {
        con.Open(); 
        da.Fill(ds, "login");

    }
    catch 
    { 
        new ApplicationException("Data Error:");
    }
    finally { con.Close(); }
    return ds;
}

由于您的方法返回类型是DataSet,因此您应该在try/catch语句之外返回,因为您的try块可能会失败。如果是fail,你的方法不返回任何值。这就是为什么你会得到这个错误。你可以这样使用;

public DataSet GetUsersDataSet()
{
    SqlConnection con = new SqlConnection(connectionString);
    SqlDataAdapter da = new SqlDataAdapter("SELCT * FROM login", con);
    DataSet ds = new DataSet();
    try
    {
        con.Open(); 
        da.Fill(ds, "login");
    }
    catch 
    { 
        new ApplicationException("Data Error:");
    }
    finally { con.Close(); }
    return ds;
}

您只是忘记抛出在catch上创建的异常。这应该能解决你的问题。

查看此链接

据我所知,当数据库操作失败时,您想要重新抛出异常:

public DataSet GetUsersDataSet()
{
    SqlConnection con = new SqlConnection(connectionString);
    SqlDataAdapter da = new SqlDataAdapter("SELCT * FROM login", con);
    DataSet ds = new DataSet();
    try
    {
        con.Open(); 
        da.Fill(ds, "login");
        return ds;
    }
    catch 
    { 
       throw new ApplicationException("Data Error:");
    }
    finally { con.Close(); }
}

因此,如果try块抛出异常,ApplicationException将在finally块关闭连接后重新抛出异常。

如果我错了,这不是你想要的。new ApplicationException("Data Error:");不会在catch块中做任何事情,但会创建ApplicationException的新实例,所以你应该删除它

该方法可能不返回DataSet(例如,如果da.Fill抛出异常),但这是return语句的契约。

您可以通过将return移到try-catch:

之外来确保它:
public DataSet GetUsersDataSet()
{
    DataSet ds = new DataSet();
    // ...
    try{
        // ...
    }
    catch{ 
        //...
    }
    finally{ 
        //...
    }
    return ds;
}
c#规格:

8.9.4 return语句将控制权返回给出现return语句的函数成员的调用方。

//……

如果return语句被一个或多个try语句块和相关的finally语句块所包围,控制权将首先转移到最里面的try语句的finally语句块。当控制到达finally块的终点时,控制将转移到下一个封闭try语句的finally块。这个过程会一直重复,直到所有try语句的finally块执行完毕。