您好我正在尝试在C#中创建CRUD函数,但是我的第一个是FetchALL,因为到目前为止它并不是所有的代码路径都返回一个值。
到目前为止我的代码
public SqlDataReader FetchAll(string tableName)
{
using (SqlConnection conn = new SqlConnection(_ConnectionString,))
{
string query = "SELECT * FROM " + tableName;
SqlCommand command = new SqlCommand(query, conn);
using (SqlDataReader reader = command.ExecuteReader())
conn.Open();
conn.Close();
}
}
}
}
我可以给你更多信息,谢谢
答案 0 :(得分:5)
首先,您没有从方法中返回任何内容。我想补充一下,你确定要返回一个SqlDataReader吗?它在一个使用区域内声明,因此无论如何它将在您返回时关闭。我认为你应该重新评估这个函数应该返回什么。
答案 1 :(得分:5)
您的返回类型为SqlDataReader
,但您不会在代码中的任何位置返回任何内容。至少你应该声明你的数据阅读器并将其返回:
public SqlDataReader FetchAll(string tableName)
{
SqlDataReader reader;
using (SqlConnection conn = new SqlConnection(_ConnectionString))
{
string query = "SELECT * FROM " + tableName;
// added using block for your command (thanks for pointing that out Alex K.)
using (SqlCommand command = new SqlCommand(query, conn))
{
conn.Open(); // <-- moved this ABOVE the execute line.
reader = command.ExecuteReader(); // <-- using the reader declared above.
//conn.Close(); <-- not needed. using block handles this for you.
}
}
return reader;
}
注意,我已经注意到我看到的其他一些问题,您可以通过我的评论看到。
另外,我想指出一些非常重要的事情:你应该始终避免查询中的字符串连接,因为这会让你面临SQL注入攻击的风险(正如gmiley正式指出的那样) 。在这种情况下,您应该创建一个枚举,其中包含与所有可能的表名相关联的值,然后使用字典根据其枚举值查找表名。如果用户提供了无效/未知值,则会抛出参数异常。
这不是问题的结束(正如Default指出的那样)。您无法在using
块中创建连接,该块在退出块后立即处理和关闭,然后使用从该方法返回的SqlDataReader
。如果我是你,我会返回DataSet
而不是SqlDataReader
。以下是我的表现:
首先,创建可能的表值的枚举:
public enum Table
{
FirstTable,
SecondTable
}
将表枚举值映射到表名的字典(将在静态构造函数中填充):
private static Dictionary<Table, string> _tableNames = new Dictionary<Table, string>(); // populate this in your static constructor.
然后这是获取数据的方法:
public static System.Data.DataSet FetchAll(Table fromTable)
{
var ret = new System.Data.DataSet();
using (var conn = new System.Data.SqlClient.SqlConnection(_connectionString))
{
string tableName = "";
if (!_tableNames.TryGetValue(fromTable, out tableName)) throw new ArgumentException(string.Format(@"The table value ""{0}"" is not known.", fromTable.ToString()));
string query = string.Format("SELECT * FROM {0}", tableName);
using (var command = new System.Data.SqlClient.SqlCommand(query, conn))
{
using (var adapter = new System.Data.SqlClient.SqlDataAdapter(command))
{
adapter.Fill(ret);
}
}
}
return ret;
}
最后一点,我建议您根据惯例使用较低的驼峰案例命名您的班级变量,例如: _connectionString
。
答案 2 :(得分:1)
您需要该方法的返回语句才能返回值。