我可以帮助解释下面这个答案,以及它如何与代表合作。答案来自:C# abstraction and database layer
...如果你坚持使用DataReader的想法,你可以将一个委托传递给helper,它在using语句中被调用:
public string GetMySpecId(string dataId)
{
return _dbHelper.ExecuteQuery(
dr =>
{
if(dr.Read())
{
return dr[0].ToString();
}
// do whatever makes sense here.
},
@"select ""specId"" from ""MyTable"" where ""dataId"" = :dataId",
new SqlParameter("dataId", dataId));
return result.Rows[0][0].ToString();
}
您还可以使用像Dapper这样的轻量级工具来简化一些语法并处理映射到您的数据类型。 (你仍然需要处理打开连接等问题。)
答案 0 :(得分:0)
从上面声明ExecuteQuery
方法应如下所示:
public DataTable ExecuteQuery(Func<DataReader, DataTable> delegateMethod, string sqlQuery, SqlParameter param)
{
using (SqlConnection conn = new SqlConnection(this.MyConnectionString))
{
conn.Open();
// Declare the parameter in the query string
using (SqlCommand command = new SqlCommand(sqlQuery, conn))
{
// Now add the parameter to the parameter collection of the command specifying its type.
command.Parameters.Add(param);
command.Prepare();
// Now, add a value to it and later execute the command as usual.
command.Parameters[0].Value = dataId;
using (SqlDataReader dr = command.ExecuteReader())
{
return delegateMethod(dr);
}
}
}
}
那应该是正确的,您可能必须在Func中交换DataReader和DataTable,我不记得哪个首先是param类型或返回类型。
以下是使用Func
委托的另一个示例,如果您不需要返回类型,还有Action
委托。