并非所有代码路径都返回值

时间:2013-10-29 17:52:15

标签: c# asp.net crystal-reports

错误:并非所有代码路径都返回一个值

我正在尝试从函数返回一个数据集但是收到此错误,

代码:

public partial class crystalReport_manual : System.Web.UI.Page
{
    String conStr = WebConfigurationManager.ConnectionStrings["LoginDatabaseConnectionString"].ConnectionString;

    protected void Page_Load(object sender, EventArgs e)
    {
            DataSet1 ds = Dataset_load("Select * from login"); 

            ReportDocument rd = new ReportDocument();
            rd.Load(Server.MapPath("CrystalReport.rpt"));
            rd.SetDataSource(ds);
            CrystalReportViewer1.ReportSource = rd;



    }

    public DataSet1 Dataset_load(String query) 
    {
        SqlConnection sqlcon = new SqlConnection(conStr);
        SqlCommand sqlCom = new SqlCommand("select * from Login", sqlcon);
        SqlDataAdapter sqlDA = new SqlDataAdapter(sqlCom);
       // DataSet ds = new DataSet("CRDataSet");

        try
        {
            sqlcon.Open();
            //sqlCom.ExecuteNonQuery();
            //sqlDA.Fill(ds,"Login");

            DataSet1 ds = new DataSet1();
            DataTable dt = new DataTable("DT_CR");
            sqlDA.Fill(dt);
            ds.Tables[0].Merge(dt);
            return ds;    
        }
        catch (Exception exc)
        {
            Response.Write(exc.Message);
        }
        finally 
        {
            sqlcon.Close();
        }



    }

2 个答案:

答案 0 :(得分:4)

如果发生异常,您的catchfinally块应该返回一些值。

由于您只是在finally中关闭了连接,因此可以使用using阻止:

public DataSet1 Dataset_load(String query)
{
    DataSet1 ds = new DataSet1();
    using(SqlConnection sqlcon = new SqlConnection(conStr))
    using(SqlCommand sqlCom = new SqlCommand("select * from Login", sqlcon))
    using (SqlDataAdapter sqlDA = new SqlDataAdapter(sqlCom))
    {
        try
        {
            //sqlCom.ExecuteNonQuery();
            //sqlDA.Fill(ds,"Login");
            DataTable dt = new DataTable("DT_CR");
            sqlDA.Fill(dt);
            ds.Tables[0].Merge(dt);
            return ds;

        }
        catch (SqlException se)
        {
            Response.Write(se.Message);
            return null;
        }
        catch (Exception exc)
        {
            Response.Write(exc.Message);
            return null;
        }
    }
}

using内部转换为try-finally块,并与IDisposable中实现finally的块一起使用,Dispose阻止它调用SqlConnection方法,因为{{ 1}},SqlCommandSqlDataAdapter,所有实现IDisposable都带有using语句,它将在结尾处调用Dispose来关闭连接。

答案 1 :(得分:1)

public DataSet1 Dataset_load(String query)
{
    DataSet1 ds = new DataSet1();
    using(SqlConnection sqlcon = new SqlConnection(conStr))
    using(SqlCommand sqlCom = new SqlCommand("select * from Login", sqlcon))
    using (SqlDataAdapter sqlDA = new SqlDataAdapter(sqlCom))
    {
        try
        {
            //sqlCom.ExecuteNonQuery();
            //sqlDA.Fill(ds,"Login");
            DataTable dt = new DataTable("DT_CR");
            sqlDA.Fill(dt);
            ds.Tables[0].Merge(dt);
            //return ds;

        }
        catch (SqlException se)
        {
            Response.Write(se.Message);
            //return null;
        }
        catch (Exception exc)
        {
            Response.Write(exc.Message);
            //return null;
        }
    }

    return ds;

}

建立前一个用户的响应,如果在using语句的末尾返回一个空的DataSet,您可以随时检查ds.Tables.Count以查看是否返回了任何内容。否则,您可以使用上面的逻辑和null检查