CommandType.Text与CommandType.StoredProcedure

时间:2009-03-13 17:59:25

标签: c# sql database ado.net

与仅使用文本命令相比,显式使用StoredProcedure CommandType有什么好处?换句话说,是

cmd = new SqlCommand("EXEC StoredProc(@p1, @p2)");
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("@p1", 1);
cmd.Parameters.Add("@p2", 2);

更糟糕
cmd = new SqlCommand("StoredProc");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@p1", 1);
cmd.Parameters.Add("@p2", 2);

编辑:修复了错误的复制粘贴作业(再次)。此外,问题的重点是数据访问类。我宁愿能够将存储的proc名称和参数传递到一行,而不是每个参数的额外行。

2 个答案:

答案 0 :(得分:7)

一个区别是消息泵送的发生方式。

在我以前工作的地方,我们有一些过夜运行的批处理过程。其中许多只是涉及运行存储过程。我们曾经使用sql server作业调度这些作业,但是从它移开而不是从.Net程序调用这些程序。这使我们能够将所有我们的计划任务保存在一个地方,甚至是那些与Sql Server无关的任务。

它还允许我们在调用过程的.Net程序中构建更好的日志记录功能,以便所有过夜进程的日志记录保持一致。存储过程将使用sql printraiserror函数,.Net程序将接收并记录这些函数。我们学到的是CommandType.StoredProcedure总是将这些消息缓冲到大约50个批处理中。.Net代码在程序完成或刷新缓冲区之前不会看到任何日志事件,无论如何你在连接上设置了什么选项或者你在sql中做了什么。 CommandType.Text为我们解决了这个问题。

作为一个副作用,我会在查询参数中使用显式类型。让.Net尝试推断你的参数类型会在某些情况下引起问题。

答案 1 :(得分:3)

它更干净。

您正在调用存储过程,为什么不使用CommandType.StoredProcedure

相关问题