0

我在课堂上公开声明了一个数据集,这是代码

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 之后尝试过,那时它很好。任何人都可以告诉错误是什么。?

4

7 回答 7

1

如果try失败会发生什么?您需要在块return之外的语句。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;
}
于 2013-02-28T10:11:16.633 回答
0

试想一下,如果您遇到异常,则不会在 catch 块中返回任何内容。所以添加 try catch 块的返回端。使用单次退货而不是多次退货。

try
{
   con.Open(); 
    da.Fill(ds, "login");

 }
catch
{
    new ApplicationException("Data Error:");

}
return ds;
于 2013-02-28T10:12:13.680 回答
0

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

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;

}
于 2013-02-28T10:11:35.870 回答
0

您的方法应该返回一个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;

}
于 2013-02-28T10:16:06.803 回答
0

该方法可能不返回a DataSet(fe if da.Fillthrows an exception),但这是return语句的约定。

您可以通过将return移到外部来确保它try-catch

public DataSet GetUsersDataSet()
{
    DataSet ds = new DataSet();
    // ...
    try{
        // ...
    }
    catch{ 
        //...
    }
    finally{ 
        //...
    }
    return ds;
}

C# 规格:

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

//...

如果 return 语句被一个或多个带有相关 finally 块的 try 块包围,则控制最初转移到最里面的 try 语句的 finally 块。当控制到达 finally 块的终点时,控制将转移到下一个封闭 try 语句的 finally 块。重复这个过程,直到所有封闭的 try 语句的 finally 块都已执行。

于 2013-02-28T10:16:54.200 回答
0

您只是忘记抛出您在捕获时创建的异常。那应该可以解决您的问题。

看看这个链接

于 2013-02-28T10:17:59.220 回答
0

据我了解,您想在数据库操作失败时重新引发异常:

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因此您应该将其删除。

于 2013-02-28T10:20:51.540 回答