You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)。

  • 修复步骤:

    1. 添加输出参数@userID,并指定参数方向为Output
    2. 修正无效的null判断逻辑(应该判断输入文本是否为空,而非刚创建的SqlParameter对象)
    3. 移除多余的ToString()调用(cmd.Parameters.Add()不需要转字符串)
    4. 执行存储过程后,获取输出参数的值存入隐藏字段

修复后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:25:25