asp.net 过程需要“未提供”的参数

cwtwac6a  于 2023-03-31  发布在  .NET
关注(0)|答案(2)|浏览(196)

我讨厌寻求帮助(一般来说),但也在这里,因为我的大多数问题可能很容易解决,但我是新的编程,不能过去这个错误。
我正在开发一个C#应用程序,它从.NET表单中获取用户输入并将其传递到数据库。单击一个按钮,就会调用一个方法,该方法生成一个随机ID并将其插入到数据库中的一列中,将新生成的ID存储到一个隐藏字段中,然后调用存储过程来填充webform字段中键入的其余数据。
在我开始将ID存储在隐藏字段中之前,大多数情况都很好,现在事情已经走下坡路了。现在,我得到了错误:“System.Data.SqlClient.SqlException:过程或函数“User_Add”需要参数“@ UID”,但未提供该参数。
我尝试重新排列代码,首先定位生成ID的方法,然后调用存储过程,甚至使用存储过程将ID插入表中。不管我做了什么重新排列,我仍然得到这个错误。我不知道我还应该做什么。有人有建议吗?下面是我的一些代码:为了简单起见,我已经用占位符替换了变量的实际名称和诸如此类的东西,并删除了几个参数:

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
hyrbngr7

hyrbngr71#

添加输出参数。您的存储过程需要3个参数。即使不使用参数,也需要提供它。

SqlParameter userId = new SqlParameter("@userID", SqlDbType.Int);
OutputParam.Direction = ParameterDirection.Output;
cmd.Parameters.Add(OutputParam);
fzwojiic

fzwojiic2#

您需要提供@UID参数作为输出参数

SqlParameter uidParam = new SqlParameter("@UID", SqlDbType.Int) {Direction = ParameterDirection.Output};
cmd.Parameters.Add(uidParam);

ToString似乎是多余的,cmd.Prepare()也是不必要的。
此外,检查null没有意义,因为检查的是实际的参数对象,它永远不会为空。

cmd.Parameters.Add("@item1", SqlDbType.NVarChar, 50).Value = box_box1name.Text ?? (object) DBNull.Value;
cmd.Parameters.Add("@item2", SqlDbType.NVarChar, 50).Value = box_box2name.Text ?? (object) DBNull.Value;

相关问题