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

时间:2014-07-22 05:53:01

标签: c# .net return

我收到以下错误:

  

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

的值

这是我的代码:

public Product[] LoadAllDatas()
    {
        SqlConnection con = new SqlConnection("Server=####; Integrated Security=true;Database=Store");

        SqlCommand cmd = new SqlCommand("usp_LoadTestData");
        cmd.Connection = con;
        con.Open();
        cmd.CommandType = CommandType.StoredProcedure;
        SqlDataReader dr = cmd.ExecuteReader();

        while (dr.Read())
        {
            return new Product[]
            {
                new Product() { ProductId = Convert.ToInt32(dr["Id"]), Name = dr["Name"].ToString(), AdminContent = dr["AdminComment"].ToString(), ProductTemplate = dr["ProductTemplateId"].ToString(), CreatedOnUtc = Convert.ToDateTime(dr["CreatedOnUtc"]) }
            };
        }

        con.Close();
        con.Dispose();
    }

1 个答案:

答案 0 :(得分:4)

好吧,你基本上需要考虑如果dr.Read()返回false会发生什么 - 即如果没有结果。你可能希望在这种情况下抛出异常...或者可能返回一个空数组。

此外,您应该为阅读器,命令和连接使用using语句来关闭它们 - 如果您执行返回结果,则不要关闭连接。

最后,您总是会返回一个只包含 Product的数组。这真的是你想要的吗?我希望您想要返回一个 all 结果的数组。

以下是一些解决所有这些问题的示例代码,在没有结果的情况下返回一个空数组:

public Product[] LoadAllDatas()
{
    using (SqlConnection con = new SqlConnection(...))
    {
        con.Open();
        using (SqlCommand cmd = new SqlCommand("usp_LoadTestData", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                List<Product> results = new List<Product>();
                while (dr.Read())
                {
                    results.Add(new Product { 
                         ProductId = Convert.ToInt32(dr["Id"]),
                         Name = dr["Name"].ToString(),
                         AdminContent = dr["AdminComment"].ToString(),
                         ProductTemplate = dr["ProductTemplateId"].ToString(),
                         CreatedOnUtc = Convert.ToDateTime(dr["CreatedOnUtc"])
                    });
                }
                return results.ToArray();
            }
        }
    }
}

最后一点 - 如果您的阅读器中的值属于合适的类型,我希望您能够将Product实例化简化为:

new Product
{ 
     ProductId = (int) dr["Id"],
     Name = (string) dr["Name"],
     AdminContent = (string) dr["AdminComment"],
     ProductTemplate = (string) dr["ProductTemplateId"],
     CreatedOnUtc = (DateTime) dr["CreatedOnUtc"]
}