我正在寻找使用最少的样板代码执行数据库查询的最佳方法。SqlCommand 文档中建议的方法:
private static void ReadOrderData(string connectionString)
{
string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
try
{
while (reader.Read())
{
Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1]));
}
}
finally
{
reader.Close();
}
}
}
主要由必须在与数据库交互的每个方法中重复的代码组成。
我已经习惯于排除连接的建立,这将产生更像下面的代码。(我也在修改它以使其返回数据,以使示例不那么琐碎。)
private SQLConnection CreateConnection()
{
var connection = new SqlConnection(_connectionString);
connection.Open();
return connection;
}
private List<int> ReadOrderData()
{
using(var connection = CreateConnection())
using(var command = connection.CreateCommand())
{
command.CommandText = "SELECT OrderID FROM dbo.Orders;";
using(var reader = command.ExecuteReader())
{
var results = new List<int>();
while(reader.Read()) results.Add(reader.GetInt32(0));
return results;
}
}
}
这是一个进步,但仍然有足够的样板来唠叨我。可以进一步减少吗?特别是,我想对程序的前两行做一些事情。我不觉得该方法应该负责创建SqlCommand
. 就像在示例中一样,这是一个很小的重复,但是如果手动管理事务或更改超时或类似的事情,它似乎会增长。
编辑:假设,至少假设,必须返回一堆不同类型的数据。因此,解决方案不能只是一种千篇一律的方法,必须有几种不同的方法,至少取决于是否调用ExecuteNonQuery
, ExecuteScalar
, ExecuteReader
,ExecuteReaderAsync
或其他任何方法。我想减少其中的重复。