调用T-SQL存储过程时C#读取输出参数始终为0的问题
问题分析与解决
你的C#代码存在两个关键错误,导致读取到错误的0值:
参数方向设置错误:存储过程中的
@Stato是Output输出参数,但你错误地将其Direction设为ReturnValue——这个枚举对应的是存储过程通过RETURN语句返回的整数值,和Output参数完全是两个概念。重复添加同名参数:你先后添加了两次
@Stato参数,第一次是作为ReturnValue参数,第二次用AddWithValue传入初始值-99,这会导致参数集合混乱,SQL Server无法正确识别输出参数的位置。
修正后的C#代码
SqlCommand cmd = new SqlCommand("GetStateTorbaLabel", connection); cmd.CommandType = System.Data.CommandType.StoredProcedure; // 添加输入参数 cmd.Parameters.AddWithValue("@IDTorbaLabel", 43); // 添加输出参数,设置正确的方向 SqlParameter outParameter = cmd.Parameters.Add("@Stato", System.Data.SqlDbType.Int); outParameter.Direction = System.Data.ParameterDirection.Output; // 如果需要设置初始值(和SSMS测试一致),直接给Value赋值即可,不用重复加参数 outParameter.Value = -99; cmd.ExecuteNonQuery(); StatoTorbaLabel = Convert.ToInt32(outParameter.Value);
关键修正点说明
- 移除了重复的
cmd.Parameters.AddWithValue("@Stato", -99),改为直接给输出参数的Value属性赋值初始值 - 将
Direction从ReturnValue改为ParameterDirection.Output,匹配存储过程中参数的定义 - 确保参数集合中每个参数唯一,避免SQL Server解析参数时出现歧义
这样修改后,就能正确读取存储过程输出的@Stato值了。
内容的提问来源于stack exchange,提问作者Riccardo
相关产品推荐
相关产品推荐

