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
相关产品推荐
相关产品推荐

