【问题标题】:CommandType.Text vs CommandType.StoredProcedureCommandType.Text 与 CommandType.StoredProcedure
【发布时间】:2009-03-13 17:59:24
【问题描述】:

与仅使用文本命令相比,显式使用 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 名称和参数,而不是每个参数的额外行。

【问题讨论】:

    标签: c# sql database ado.net


    【解决方案1】:

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

    在我以前工作的地方,我们有许多批处理流程需要通宵运行。其中许多只涉及运行存储过程。我们曾经使用 sql server 作业来安排这些工作,但从它移到了 .Net 程序中调用这些过程。这使我们能够将所有我们的计划任务保存在一个地方,即使是那些与 Sql Server 无关的任务。

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

    作为一个附带问题,我会在您的查询参数中使用显式类型。在某些情况下,让 .Net 尝试推断您的参数类型可能会导致问题。

    【讨论】:

    • 关于隐式输入问题的任何例子?我听说过几次,但从未见过。
    • 假设您在 varchar 列上有一个索引。 .Net 将假定 nvarchar 并且无法使用索引。
    • 接下来......所以如果我有一个带有 varchar 参数的存储过程,并且我传入了一个字符串,会发生什么?
    • 对 SP 的影响比对即席查询的影响要小。 SQL Server 只会做一次从 nvarchar 到 varchar 的额外转换,而不是废弃整个索引。但这仍然很糟糕。以 datetime 为例:如果 .Net 得到一个 datetime 列错误并且 sql server 不能隐式转换,那么你就有问题了。
    • [续] 我个人没有看到最后一个示例,因为我总是在查询参数上使用显式类型,但我知道这是可能的。
    【解决方案2】:

    它更干净。

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

    【讨论】:

    • 因为我正在编写一个允许使用参数数组作为参数的 DB 层。
    • +1 - 清晰是任何需要与可维护性等事项相协调的长期项目的神奇词汇! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2015-12-10
    • 2010-09-07
    相关资源
    最近更新 更多