参数传递失败主因是方向、类型或命名未对齐;需显式设置ParameterDirection、精确匹配SqlDbType、严格保持参数名含@及大小写一致、中文用nvarchar加N前缀、空值传DBNull.Value。

参数传递失败,90% 是方向、类型或命名没对齐,不是存储过程写错了。
SqlParameter 必须显式设 ParameterDirection
Output 和 ReturnValue 参数默认是 Input 方向,不改就收不到值,甚至报“必须声明标量变量”。
-
Output参数(如@result INT OUTPUT):必须设parameter.Direction = ParameterDirection.Output -
ReturnValue(对应RETURN 123):要单独建一个SqlParameter,Direction设为ParameterDirection.ReturnValue,且ParameterName通常为空字符串或"RETURN_VALUE" -
InputOutput参数:既要传初始值,又得允许被修改,Direction和Value都得配好,不能只设方向不给初值
SqlDbType 必须精确匹配,不能靠 DbType 猜
类型写错会导致静默截断、精度丢失或直接报“无法将值转换为请求的类型”。
-
varchar(max)/nvarchar(max):必须设Size = -1,否则按默认长度(如 4000)截断 -
datetime2列别用SqlDbType.DateTime,要用SqlDbType.DateTime2 -
decimal(p,s):必须同时设Precision和Scale属性,否则可能四舍五入丢精度 - 空值必须传
DBNull.Value,C# 的null在部分旧驱动里不识别
@ 符号、大小写、拼写一个都不能少
SQL Server 虽不区分大小写,但 SqlParameter.ParameterName 字符串必须和存储过程中定义的完全一致。
- 漏写
@是最常见错误:new SqlParameter("id", 123)→ 存储过程收不到@id;正确是new SqlParameter("@id", 123) - 如果存储过程定义的是
@ID(全大写),C# 里也得写"@ID",尤其在启用了区分标识符的数据库中 - 调用
EXEC语句时,SQL 字符串里也要保持一致:"EXEC dbo.TestPro @id",不能写成"EXEC dbo.TestPro id" - 测试时故意传错名(如
@user_idd),确认报错是「找不到参数」而非静默忽略
中文参数要带 N 前缀 + nvarchar 类型
中文传进去变问号或乱码,大概率是类型和前缀没配对。
- 存储过程参数必须定义为
nvarchar(不是varchar),例如@name nvarchar(100) - C# 传参时,字符串字面量要加
N前缀:command.Parameters.Add("@name", SqlDbType.NVarChar).Value = "张三";不够,得确保底层 SQL 执行时是N'张三' - 如果用
sp_executesql动态执行,字符串字面量也得带N:N'SELECT * FROM t WHERE name = @name'
最容易被忽略的是:Output 参数没初始化就传进去,或者在调用前忘了给变量赋初值——有些驱动会因此跳过绑定,导致返回值始终为 null。别依赖“应该能行”,每个参数的方向、类型、名称、前缀、空值处理,都得像拧螺丝一样一个个对准。

















