数据集-并非所有代码路径都返回值
本文关键字:代码 路径 返回值 数据集 | 更新日期: 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块执行完毕。