“参数的数量与存储过程的值的数量不匹配”System.Data.Common.DbCommand细微差别

时间:2009-03-02 11:19:01

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

这可能是一个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。

3 个答案:

答案 0 :(得分:3)

IMHO始终应该指定CommandType - 显式性总是优于隐式。很明显,在两种环境下都会发生一些不同的事情,但是当您明确了解命令类型时,代码会按预期工作。

我唯一能想到的是 - 数据库设置完全相同 - 特别是在处理NULL时?

修改

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

答案 1 :(得分:1)

以下是我经常尝试的一些故障排除提示。

  1. 检查“数据库”对象类型所在的DAL程序集的程序集版本
  2. 将库引用检查到您的DAL - 无论您是否从GAC引用DLL - 我在使用DLL引用 GAC 之前遇到了问题,其中包含旧程序集
  3. 当您的代码尝试连接到UAT环境中的数据库时,请检查默认数据库 - 它可能指向其他数据库,具体取决于您与数据库的连接方式。
  4. 所有仍然不太好,干净且重新构建解决方案

    侧评:嗯,我不认为“System.Data.IDataReader”将被包含在所使用的技术中;)

答案 2 :(得分:0)

您可以使用SQL事件探查器查看SQL Server透视图上发生的情况。

理想情况下,让某人从生产中捕获痕迹,以便对其进行比较。