You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SqlParameter Output返回null问题:存储过程输出参数值丢失

问题原因与解决方案

核心原因1:输出参数需在DataReader释放后读取

SQL Server执行存储过程时,会优先返回查询生成的结果集,输出参数的最终值要等所有结果集完全传递给客户端后才会被填充。你的代码中在reader仍处于打开(using块内)的状态下直接读取outParam.Value,此时输出参数还未被赋值,所以返回null。

核心原因2:存储过程参数名拼写错误(潜在问题)

存储过程中定义的参数是@lenth(缺少字母g),但C#代码中传递的参数名是length,这会导致分页参数@length没有被正确传入存储过程,虽然这不是输出参数为null的直接原因,但会导致分页逻辑失效,需要修正。


修复步骤

1. 调整C#代码,在DataReader释放后读取输出参数

修改代码,将读取输出参数的逻辑移到reader的using块之外(利用using自动释放资源的特性),或者主动关闭reader后再读取:

await using var connection = new SqlConnection("Server=...");
await connection.OpenAsync();

await using var command = new SqlCommand("dbo.List", connection) { CommandType = CommandType.StoredProcedure };

command.Parameters.Add(new SqlParameter("index", SqlDbType.Int) { Value = 0 });
command.Parameters.Add(new SqlParameter("length", SqlDbType.Int) { Value = 3 });

var outParam = new SqlParameter("available", SqlDbType.Int) { Direction = ParameterDirection.Output };
command.Parameters.Add(outParam);

// 读取结果集
await using (var reader = await command.ExecuteReaderAsync())
{
    while (await reader.ReadAsync())
    {
        Console.WriteLine(reader["Name"]);
    }
}

// Reader已释放,此时输出参数值已填充
Console.WriteLine("Available items: " + outParam.Value + " rows");

2. 修正存储过程的参数拼写错误

将存储过程中的@lenth改为@length,确保参数名与C#代码匹配:

CREATE PROCEDURE dbo.List
    @index int = 0,
    @length int = 10, -- 修正拼写错误
    @available int OUTPUT
AS
BEGIN
    SELECT * FROM dbo.table1 WHERE ...; -- 此处需补充正确的分页逻辑
    @available = (SELECT COUNT(*) FROM dbo.table1);
END

内容的提问来源于stack exchange,提问作者Sigurd Garshol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:22:42