【发布时间】:2014-02-27 20:51:24
【问题描述】:
在我们项目的当前状态下,我们至少有一个方法用于调用我们在数据库服务器上创建的每个存储过程。由于这些方法非常冗长,涉及创建每个 SqlParameter 然后将它们传递给数据库连接,因此我正在考虑创建一种方法来概括该过程以满足我们的需求。
这是我目前想出的:
public static void UpdateTableTest(string procedureName, params object[] paramList)
{
if (sessionID == -1)
GetActiveSession();
SqlConnection scn = new SqlConnection(GetConnectionString());
try
{
scn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = scn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = procedureName;
SqlCommandBuilder.DeriveParameters(cmd);
for (int i = 0; i < paramList.Length; i++)
{
cmd.Parameters[i+1].Value = paramList[i];
}
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
scn.Close();
}
}
除了我会遇到的不同查询类型的问题,以及我需要从中返回一些数据的查询类型之外,这种执行存储过程的方法是否存在固有的错误?我应该为每个存储过程坚持一个单独的方法吗?
【问题讨论】:
-
摆脱那个 try/catch 块(它只会弄乱你的调用堆栈),而是将你的
SqlConnection和SqlCommand放入using块中。 -
我要在这里提出的唯一批评是,在维护方面,您可能会遇到 cmd 中的参数顺序和函数的参数顺序必须匹配的问题,而且这里不是很明确。也许会收到一个字典,其中 key 是参数的名称,然后按名称分配会在这里为您提供更多保护。我认为这里最大的骗局是,您每次都必须往返 DB 才能获得参数列表 - 昂贵。您应该知道并提供先验参数以保存往返。如果你实现它,将很难修复它。
-
@LB2 我明白你所说的往返行程。你认为从我的 C# 调用每个存储过程的正确方法是将它们放在自己单独的方法中吗?
-
我认为拥有通用函数并没有错,但我可能会做以下事情:公开帮助方法以获取 IDbParameter(以防您稍后切换数据库),让函数的调用者设置参数以避免往返,然后传递这些参数的列表,以便您可以通过上面的这个通用代码运行它)。当然,如果您想扩展此功能,您可以使用分层方式允许调用者既懒惰又显式。
标签: c# sql-server stored-procedures