gpt4 book ai didi

c# - 存储过程问题

转载 作者:行者123 更新时间:2023-11-30 21:19:55 25 4
gpt4 key购买 nike

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

        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

最佳答案

编辑:我想我现在看到了问题所在。在该过程完成之前,SQL Server 不会分配输出参数。第二个select在流的时候,输出参数不会返回给客户端。

现在我假设您正在调用 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 在执行完整个存储过程之前并不知道正确的值。

关于c# - 存储过程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3597463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com