【问题标题】:Stored Procedure Problem存储过程问题
【发布时间】:2010-08-30 02:21:44
【问题描述】:

我在访问下面存储过程中的输出时遇到问题

        DbParameter DbParm = command.CreateParameter();
        DbParm.Direction = ParameterDirection.Output;
        DbParm.ParameterName = "@SomeValue";
        DbParm.DbType = DbType.Int32;
        DbParm.Value = null;
        command.Parameters.Add(DbParm);

执行程序后

        command.Parameters["@SomeValue"].Value;

它总是返回 Null,不过我可以访问第二个选择。这里是过程:

CREATE PROCEDURE SomeThing
  @SomeValue int OUTPUT,
AS

  SELECT @SomeValue=ID  
    FROM SomeTable
   WHERE ID=10;

  SELECT * 
    FROM SomeTable;

GO

【问题讨论】:

  • 您能向我们展示更多您的 C# 代码吗?如何将参数添加到command.Parameters 集合中?
  • 可能是错字,所以我不会将其作为答案发布,但 C# 代码的类型为 int32,而 DB 代码的类型为 nvarchar。
  • 我怀疑这是因为使用了 2 个选择..
  • select * from SomeTable where id = 10 的结果是什么?
  • @Andomar 5 列 id 当然不为空

标签: c# sql tsql stored-procedures


【解决方案1】:

编辑:我想我现在看到了问题。在过程完成之前,SQL Server 不会分配输出参数。当第二个选择是流式传输时,输出参数不会返回给客户端。

现在我假设您正在调用ExecuteNonQuery,它不要求提供结果集。 SQL Server 将在第二次选择开始时停止该过程。

如果您将 C# 代码更改为使用ExecuteReader(),则可以在阅读器完成后检索输出参数:

using (var read = yourCommand.ExecuteReader())
    while (read.Read());
// You should be able to access the output parameter here

如果您向过程中添加更多流式选择:

SELECT * FROM SomeTable where id = 1;
SELECT 'hello world';
SELECT * FROM SomeTable where null in (1,2,3);

您必须使用NextResult 将它们全部排除在外:

using (var read = yourCommand.ExecuteReader()) {
    do {
         while (read.Read());
    } while (read.NextResult());
}

在分配输出参数之前。这样做的原因是输出参数的值可能取决于最后一次选择。所以 SQL Server 在执行完整个存储过程之前并不知道正确的值。

【讨论】:

  • 好吧实际上是我在简化程序时输入错误
  • +1 添加 do/while 效果很好。 真正奇怪的是,没有它,我的代码第一次工作时,它确实返回了输出值(没有 do/while),但之后每次那个,我一直是空的。
【解决方案2】:

我从未使用过 dbparameter 对象,仅使用 system.data.sqlclient.sqlparameter 对象来完成将参数传递给 SQL Server 上的存储过程。改用 SqlParameter。

【讨论】:

  • 它与提供者无关,这就是我使用 DbParameter 的原因,实际上这不是问题,因为它在没有第二次选择的情况下工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2011-01-11
  • 2016-01-24
相关资源
最近更新 更多