【问题标题】:"The number of parameters does not match number of values for stored procedure" System.Data.Common.DbCommand nuance“参数数量与存储过程的值数量不匹配” System.Data.Common.DbCommand 细微差别
【发布时间】:2009-03-02 11:19:00
【问题描述】:

这可能是 sql server 数据库设置问题,但我不确定从哪里开始查找。

我有一个存储过程:

CREATE PROCEDURE aStoredProcedure
@dteSince DATETIME = null
AS
...

调用存储过程的C#代码是:

using (IDataReader dr = database.ExecuteReader("aStoredProcedure"))
{
...

C# 代码在生产 环境中运行良好。此处,dteSince 将设置为 null,因为它不作为输入参数提供。

问题是当我在 UAT 环境中运行它时,它返回标题中显示的消息 - 参数数量错误...

我可以通过将代码更改为:

using (IDataReader dr = database.ExecuteReader (CommandType.StoredProcedure, "aStoredProcedure"))
{
...

修复只是掩盖了代码如何在一个环境中失败而在另一个环境中正常工作的真正问题。

我已经删除并重新创建了存储过程,但没有运气。

使用 C# 2.0 和 Sql Server 2005 的技术。

【问题讨论】:

标签: c# sql sql-server-2005 datareader


【解决方案1】:

恕我直言,无论如何都应该指定 CommandType - 显式总是比隐式更可取。很明显,在两种环境中都发生了一些不同的事情,但是当您明确说明命令类型时,代码会按预期工作。

我唯一能想到的——数据库设置是否完全相同——尤其是在处理 NULL 时?

编辑

可能值得检查SET ANSI_NULLS ON/OFFSET CONCAT_NULL_YIELDS_NULL ON/OFF - 您可以查看两个数据库的属性,看看设置是否匹配。

【讨论】:

  • 同意你关于明确性的看法。在我们解决真正的问题之前,我试图避免更改代码。这可能与可选输入参数(NULLS)有关。我会看看我能在那个区域找到什么。感谢您的帮助。
  • 检查了 ANSI_NULLS 和 CONCAT_NULL_YIELDS_NULL 并且它们是相同的。我几乎认为这是问题所在。看起来 c# 代码更改是唯一的途径。再次感谢。
【解决方案2】:

以下是我通常尝试的一些故障排除技巧。

  1. 检查“数据库”对象类型所在的 DAL 程序集的程序集版本
  2. 检查库 reference 到您的 DAL - 无论您是否从 GAC 引用 DLL - 我之前在引用包含旧程序集的 GAC 的 DLL 时遇到问题李>
  3. 当您的代码尝试连接到 UAT 环境中的数据库时,请检查您的默认数据库 - 根据您连接到数据库的方式,它可能指向其他数据库。

一切都还不好,清理并重新构建解决方案

旁注:嗯,我不认为“System.Data.IDataReader”应该包含在所使用的技术中;)

【讨论】:

  • 谢谢。我将取出命名空间。我会检查你的清单
  • 进行清理和重建帮助我解决了这个问题。
【解决方案3】:

您可以使用 SQL Profiler 从 SQL Server 角度查看正在发生的事情。

最好让某人从生产中捕获跟踪,以便进行比较。

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 2019-08-16
    • 2016-06-04
    • 2023-03-19
    • 1970-01-01
    • 2022-06-28
    • 2011-03-02
    • 1970-01-01
    • 2014-11-02
    相关资源
    最近更新 更多