sql - 存储过程或函数需要未提供的参数

标签 sql sql-server stored-procedures

我尝试通过调用存储过程将数据插入 SQL Server 数据库,但收到错误

Procedure or function 'SHOWuser' expects parameter '@userID', which was not supplied.

我的存储过程称为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

最佳答案

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

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

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

关于sql - 存储过程或函数需要未提供的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19703653/

相关文章:

sql-server - 如何刷新 OLE DB 目标编辑器表选择

php - 使用存储过程列出记录

mysql - 使用一个 in 和 int 参数创建 mysql 存储过程

sql-server - 如何在 sp_executesql 中使用 OPENQUERY?

mysql - 如果另一个查询在 mysql 中获取空值,则运行查询

SQL双重比较

sql - 选择查询的良好性能的主键选择

Java 连接到 Sql server 时出现 jtds 错误

c# - 使用 C# 查询 MariaDB 数据库

c# - 按邮政编码查找产品 |半正弦算法 |表现