我收到以下错误:
并非所有代码路径都返回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();
}
答案 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"]
}