43

我正在尝试通过调用存储过程将数据插入 SQL Server 数据库,但出现错误

过程或函数“SHOWuser”需要未提供的参数“@userID”。

我的存储过程称为SHOWuser. 我已经彻底检查过了,没有遗漏任何参数。

我的代码是:

public void SHOWuser(string userName, string password, string emailAddress, List<int> preferences)
{
        SqlConnection dbcon = new SqlConnection(conn);

        try
        { 
            SqlCommand cmd = new SqlCommand();

            cmd.Connection = dbcon;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.CommandText = "SHOWuser";

            cmd.Parameters.AddWithValue("@userName", userName);
            cmd.Parameters.AddWithValue("@password", password);
            cmd.Parameters.AddWithValue("@emailAddress", emailAddress);

            dbcon.Open();

            int i = Convert.ToInt32(cmd.ExecuteScalar());

            cmd.Parameters.Clear();
            cmd.CommandText = "tbl_pref";

            foreach (int preference in preferences)
            {
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("@userID", Convert.ToInt32(i));
                cmd.Parameters.AddWithValue("@preferenceID", Convert.ToInt32(preference));

                cmd.ExecuteNonQuery();
            }
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            dbcon.Close();
        }

存储过程是:

ALTER PROCEDURE [dbo].[SHOWuser]
(
    @userName varchar(50),
    @password nvarchar(50),
    @emailAddress nvarchar(50)
)
AS
BEGIN
    INSERT INTO tbl_user(userName, password, emailAddress) 
    VALUES (@userName, @password, @emailAddress)

    SELECT
        tbl_user.userID, tbl_user.userName,
        tbl_user.password, tbl_user.emailAddress, 
        STUFF((SELECT ',' + preferenceName 
               FROM tbl_pref_master
               INNER JOIN tbl_preferences ON tbl_pref_master.preferenceID = tbl_preferences.preferenceID
               WHERE tbl_preferences.userID = tbl_user.userID
               FOR XML PATH ('')), 1, 1, ' ' ) AS Preferences
    FROM
        tbl_user

    SELECT SCOPE_IDENTITY();
END

tbl_pref这是在同一函数中使用的第二个存储过程:

ALTER PROCEDURE [dbo].[tbl_pref]
    @userID int,
    @preferenceID int
AS
BEGIN
    INSERT INTO tbl_preferences(userID, preferenceID) 
    VALUES (@userID, @preferenceID)
END
4

7 回答 7

182

就我而言,即使正确提供了所有参数值但未指定命令类型,我也收到了此异常:

cmd.CommandType = System.Data.CommandType.StoredProcedure;

上面的问题显然不是这种情况,但是这种情况下的异常描述不是很清楚,所以我决定指定。

于 2014-09-18T09:45:35.993 回答
44

我昨天遇到了这个问题,但是这里没有一个解决方案完全有效,但是它们确实为我指明了正确的方向。

我们的应用程序是一个用 C# 编写的工作流工具,并且过于简化,在数据库上有几个存储过程,以及每个存储过程使用的每个参数(名称、顺序、数据类型、大小等)的元数据表,允许我们根据需要创建尽可能多的新存储过程,而无需更改 C#。

对问题的分析表明,我们的代码在SqlCommand对象上设置了所有正确的参数,但是一旦执行,它就会抛出与 OP 相同的错误。

进一步分析显示,一些参数的值为null. 因此,我必须得出结论,SqlCommand对象会忽略其集合中值为 的任何SqlParameter对象。.Parametersnull

我发现这个问题有两种解决方案。

  1. 在我们的存储过程中,给每个参数一个默认值,所以 from @Parameter intto @Parameter int = NULL(或其他需要的默认值)。

  2. 在我们生成单个SqlParameter对象的代码中,分配DBNull.Value而不是null预期值是 SQLNULL就可以了。

最初的编码器已经继续前进,代码最初是在考虑解决方案 1 的情况下编写的,并且在权衡了两者的好处之后,我想我会坚持使用解决方案 1。为特定的存储过程指定默认值要容易得多在编写它时,而不是始终NULL按照代码中的定义。

希望对某人有所帮助。

于 2015-04-02T12:23:50.087 回答
13

您的存储过程需要 5 个参数作为输入

@userID int, 
@userName varchar(50), 
@password nvarchar(50), 
@emailAddress nvarchar(50), 
@preferenceName varchar(20) 

因此,您应该将所有 5 个参数添加到此 SP 调用中:

    cmd.CommandText = "SHOWuser";
    cmd.Parameters.AddWithValue("@userID",userID);
    cmd.Parameters.AddWithValue("@userName", userName);
    cmd.Parameters.AddWithValue("@password", password);
    cmd.Parameters.AddWithValue("@emailAddress", emailAddress);
    cmd.Parameters.AddWithValue("@preferenceName", preferences);
    dbcon.Open();

PS:目前尚不清楚这些参数的用途。您不在 SP 正文中使用这些参数,因此您的 SP 应如下所示:

ALTER PROCEDURE [dbo].[SHOWuser] AS BEGIN ..... END
于 2013-10-31T10:21:46.630 回答
8

在我的情况下,即使我在 C# 端正确设置了输出参数,我也遇到了错误我发现我忘记为存储过程的输出参数提供默认值

ALTER PROCEDURE [dbo].[test]
(
                @UserID int,
                @ReturnValue int = 0 output --Previously I had @ReturnValue int output
)
于 2015-08-12T22:54:00.203 回答
4

在我的情况下,它返回一个输出参数并且没有返回任何值。
所以改成

param.Direction = ParameterDirection.Output;
command.ExecuteScalar();

然后它抛出大小错误。所以也必须设置大小

SqlParameter param = new SqlParameter("@Name",SqlDbType.NVarChar);
param.Size = 10;
于 2015-11-18T17:04:23.257 回答
0

就我而言,我传递了所有参数,但我的代码中的一个参数是传递一个空值字符串。

例如:cmd.Parameters.AddWithValue("@userName", userName);

在上述情况下,如果 userName 的数据类型是字符串,我将 userName 传递为 null。

于 2020-11-13T01:48:47.117 回答
0

经过研究,我意识到我没有指定

command.CommandType = System.Data.CommandType.StoredProcedure;

添加后,我的应用程序运行正常。

于 2021-11-28T20:54:47.207 回答