我有一个包含许多方法的dal层,它们都调用存储过程,一些返回列表(所以使用SqlDataReader
),其他只有特定值。
我有一个帮助方法来创建SqlCommand
:
protected SqlCommand CreateSprocCommand(string name, bool includeReturn, SqlDbType returnType)
{
SqlConnection con = new SqlConnection(this.ConnectionString);
SqlCommand com = new SqlCommand(name, con);
com.CommandType = System.Data.CommandType.StoredProcedure;
if (includeReturn)
com.Parameters.Add("ReturnValue", returnType).Direction = ParameterDirection.ReturnValue;
return com;
}
现在我的平均(过度简化)方法体看起来像:
SqlCommand cmd = CreateSprocCommand("SomeSprocName"); //an override of the above mentioned method
try {
cmd.Connection.Open();
using (var reader = cmd.ExecuteReader()) {
//some code looping over the recors
}
//some more code to return whatever needs to be returned
}
finally {
cmd.Connection.Dispose();
}
有没有办法重构这个,这样我就不会丢失我的辅助函数(它会做很多其他重复的工作),但是能够使用using
?
答案 0 :(得分:13)
一种方法是将其从返回命令更改为使用使用该命令的委托:
protected void ExecuteSproc(string name,
SqlDbType? returnType,
Action<SqlCommand> action)
{
using (SqlConnection con = new SqlConnection(this.ConnectionString))
using (SqlCommand com = new SqlCommand(name, con))
{
con.Open();
com.CommandType = System.Data.CommandType.StoredProcedure;
if (returnType != null)
{
com.Parameters.Add("ReturnValue", returnType.Value).Direction =
ParameterDirection.ReturnValue;
}
action(com);
}
}
(请注意,我还删除了includeReturn
参数并使returnType
可以为空。只需将null
传递给“无返回值”。)
你将它与lambda表达式(或匿名方法)一起使用:
ExecuteSproc("SomeName", SqlDbType.DateTime, cmd =>
{
// Do what you want with the command (cmd) here
});
这样处理与创建处于同一个位置,调用者不需要担心它。我变得非常喜欢这种模式 - 现在我们已经有了lambda表达式,它已经变得更加清晰了。
答案 1 :(得分:3)
你可以这样做:
protected static SqlCommand CreateSprocCommand(SqlConnection con, string name, bool includeReturn, SqlDbType returnType)
{
SqlCommand com = new SqlCommand(name, con);
com.CommandType = System.Data.CommandType.StoredProcedure;
if (includeReturn)
com.Parameters.Add("ReturnValue", returnType).Direction = ParameterDirection.ReturnValue;
return com;
}
并将其称为:
using (SqlConnection con = new SqlConnection(this.ConnectionString))
using (SqlCommand cmd = CreateSprocCommand(con, "SomeSprocName", true, SqlDbType.Int)
{
cmd.Connection.Open();
using (var reader = cmd.ExecuteReader())
{
//some code looping over the recors
}
//some more code to return whatever needs to be returned
}
答案 2 :(得分:1)
您可以使用语句嵌套:
using (SqlCommand cmd = CreateSprocCommand("..."))
{
using (var connection = cmd.Connection)
{
connection.Open();
using (var reader = cmd.ExecuteReader())
{
...
}
...
}
}
答案 3 :(得分:0)
怎么样:
using (SqlCommand cmd = CreateSprocCommand("whatever"))
{
cmd.Connection.Open();
using (var reader = cmd.ExecuteReader())
{
//blabla
}
}
答案 4 :(得分:-1)
这是你的意思吗?
using (SqlCommand cmd = CreateSprocCommand("SomeSprocName"))
{
cmd.Connection.Open();
using (var reader = cmd.ExecuteReader())
{
//some code looping over the recors
}
}