1

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

4

3 回答 3

3

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

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

编辑

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

于 2009-03-02T11:30:59.983 回答
2

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

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

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

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

于 2009-03-02T13:06:46.103 回答
0

您可以使用 SQL Profiler 查看 SQL Server 透视图中发生的情况。

理想情况下,还要让某人从生产中捕获跟踪,以便进行比较。

于 2009-03-02T14:56:20.443 回答