调用WidgetInsert存储过程提示@Name参数未提供但已传参的问题排查
解决存储过程调用提示参数未提供的问题
你遇到的这个问题其实很常见,我一眼就注意到你的代码里漏了关键的一步——没有把SqlCommand的CommandType设置为StoredProcedure!
默认情况下,SqlCommand的CommandType是CommandType.Text,这时候它会把[dbo].[WidgetInsert]当成一段普通的SQL文本来执行,而不是去调用对应的存储过程。即使你添加了参数,SQL Server也不会把这些参数和存储过程的参数关联起来,自然就会提示你缺少@Name参数了。
修复步骤
只需要在创建SqlCommand之后,添加一行代码设置CommandType:
internal static void WidgetInsert(string cnnString, Widget item) { using (SqlConnection connection = new SqlConnection(cnnString)) { SqlCommand command = new SqlCommand("[dbo].[WidgetInsert]", connection); // 加上这行关键配置! command.CommandType = CommandType.StoredProcedure; command.Parameters.AddWithValue("@Name", item.Name); command.Parameters.AddWithValue("@Description", item.Description); connection.Open(); command.ExecuteNonQuery(); } }
其他可选排查方向(结合你的情况概率较低,但可以确认)
- 核对存储过程内的参数名是否确实为
@Name,有没有拼写错误(比如多字符/少字符)——虽然SQL Server不区分大小写,但拼写不匹配会直接导致参数关联失败。 - 再次确认
item.Name的有效值状态:如果是null,AddWithValue会自动转为DBNull.Value,但此时错误提示通常是“参数不能为null”而非“未提供参数”,所以这个可能性很小,但也可以快速验证下。
内容的提问来源于stack exchange,提问作者Tarzan
相关产品推荐
相关产品推荐

