C#调用存储过程报错:未提供@UID参数的解决求助
问题描述
我是编程新手,平时不爱求助,但这次实在卡壳了。我正在做一个C#应用,从.NET表单获取用户输入存入数据库。点击按钮时,原本的逻辑是生成随机ID插入数据库列,把新ID存到隐藏字段,再调用存储过程填充其他表单数据。之前大部分功能正常,但加了隐藏字段存ID后开始报错:
System.Data.SqlClient.SqlException: Procedure or function 'User_Add' expects parameter '@UID', which was not supplied.
我试过调整代码顺序(先生成ID再调用存储过程)、改成用存储过程插入ID,但都没解决问题。附上相关代码:
C#代码
public void UserDataPassage(string cnxnString) { using (SqlConnection cnxn = new SqlConnection(cnxnString)) { cnxn.Open(); SqlCommand cmd = new SqlCommand("[dbo].[Users_Add]", cnxn); // Create and prepare an SQL statement cmd.CommandType = CommandType.StoredProcedure; SqlParameter item1Param = new SqlParameter("@item1", SqlDbType.NVarChar, 50); SqlParameter item2Param = new SqlParameter("@item2", SqlDbType.NVarChar, 50); // Check to see if values are null; pass to DB as a null value if true try { if (item1Param == null) { item1Param.Value = DBNull.Value; } if (item2Param == null) { item2Param.Value = DBNull.Value; } } catch (InvalidCastException) { } // Equate the parameters to the ASP IDs created in Default.aspx item1Param.Value = box_box1name.Text; item2Param.Value = box_box2name.Text; // Add values to the RBuilder database. cmd.Parameters.Add(item1Param).ToString(); cmd.Parameters.Add(item2Param).ToString(); // Call Prepare after setting the commandtext parameters cmd.Prepare(); // Execute the query (does not return any values); cmd.ExecuteNonQuery(); } }
存储过程代码
USE [TestDB] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[User_Add] @item1 NVARCHAR(50), @item2 NVARCHAR(50), @userID INT OUT AS BEGIN SET NOCOUNT ON; INSERT INTO [Table1] (item1, item2) VALUES (@item1, @item2) SET @userID= SCOPE_IDENTITY() END
解决建议
核心问题:参数不匹配
你的存储过程定义了输出参数@userID,但当前C#代码完全没有添加这个参数,导致数据库端认为缺少必要参数(报错里的@UID应该是你修改存储过程前的参数名,现在要统一用@userID)。修复步骤:
- 添加输出参数@userID,并指定参数方向为
Output - 修正无效的null判断逻辑(应该判断输入文本是否为空,而非刚创建的SqlParameter对象)
- 移除多余的
ToString()调用(cmd.Parameters.Add()不需要转字符串) - 执行存储过程后,获取输出参数的值存入隐藏字段
- 添加输出参数@userID,并指定参数方向为
修复后的C#代码示例
public void UserDataPassage(string cnxnString) { using (SqlConnection cnxn = new SqlConnection(cnxnString)) { cnxn.Open(); SqlCommand cmd = new SqlCommand("[dbo].[Users_Add]", cnxn); cmd.CommandType = CommandType.StoredProcedure; // 添加输入参数,处理空值情况 SqlParameter item1Param = new SqlParameter("@item1", SqlDbType.NVarChar, 50); item1Param.Value = string.IsNullOrEmpty(box_box1name.Text) ? DBNull.Value : (object)box_box1name.Text; SqlParameter item2Param = new SqlParameter("@item2", SqlDbType.NVarChar, 50); item2Param.Value = string.IsNullOrEmpty(box_box2name.Text) ? DBNull.Value : (object)box_box2name.Text; // 添加输出参数@userID SqlParameter userIdParam = new SqlParameter("@userID", SqlDbType.Int); userIdParam.Direction = ParameterDirection.Output; // 将参数添加到命令对象 cmd.Parameters.Add(item1Param); cmd.Parameters.Add(item2Param); cmd.Parameters.Add(userIdParam); cmd.ExecuteNonQuery(); // 获取生成的ID并存入隐藏字段 if (userIdParam.Value != DBNull.Value) { int newUserId = (int)userIdParam.Value; // 假设你的隐藏字段ID是hiddenUserId hiddenUserId.Value = newUserId.ToString(); } } }
- 额外说明:
你的存储过程已经通过SCOPE_IDENTITY()获取了插入后的自增ID,不需要自己生成随机ID,直接用这个返回的ID存入隐藏字段即可,这样能保证ID和数据库里的记录完全对应。
内容的提问来源于stack exchange,提问作者worbplex
相关产品推荐
相关产品推荐

