"过程或函数指定了太多参数"但它没有

Noa*_*ley 4 c# sql stored-procedures

提前感谢您的帮助.非常感谢.

经过两个长时间的淘汰Stack Overflow和其他谷歌搜索结果,因为我得到的"程序或功能指定了太多的参数",我找不到有用的帮助.原因是无处不在,我读到我可能要么指定了太多参数,我的参数名称不正确,或者类型不正确.这些都不适合我的情况.这是我的代码:

CREATE PROCEDURE dbo.sproc_UpdateInfo 

(
@Name nvarchar(40),
@UserId varchar(50),
@Password varchar(50),
@Address nvarchar(120)
)

AS
Update tbl_Users SET Name=@Name, Password=@Password, Address=@Address WHERE UserId=@UserId


RETURN
Run Code Online (Sandbox Code Playgroud)

这是C#方面的事情:

SqlCommand sqlCmd = new SqlCommand();
sqlCmd.CommandText = "sproc_UpdateInfo";
sqlCmd.CommandType = CommandType.StoredProcedure;

sqlCmd.Parameters.Add("@Name", SqlDbType.NVarChar, 40).Value = name;

sqlCmd.Parameters.Add("@UserId", SqlDbType.VarChar, 50).Value = userID;
sqlCmd.Parameters.Add("@Password", SqlDbType.VarChar, 50).Value = password;
sqlCmd.Parameters.Add("@Address", SqlDbType.NVarChar, 120).Value = address;

SqlConnection sqlConn = new SqlConnection(connectionString);

sqlCmd.Connection = sqlConn;

try
{
    sqlCmd.Connection.Open();

    int rowaffected = sqlCmd.ExecuteNonQuery(); //Error occurs here
    return rowaffected;
}
catch (SqlException se)
{
    throw new Exception("SqlException: sqlstr=" + sqlCmd.CommandText, se);
}
finally
{
    sqlCmd.Dispose();
    sqlConn.Close();
}
Run Code Online (Sandbox Code Playgroud)

map*_*ale 10

更改为此并告诉我错误是否消失...

sqlCmd.Parameters.Add("@Name", SqlDbType.NVarChar, 40).Value = name ?? "";

sqlCmd.Parameters.Add("@UserId", SqlDbType.VarChar, 50).Value = userID ?? "";
sqlCmd.Parameters.Add("@Password", SqlDbType.VarChar, 50).Value = password ?? "";
sqlCmd.Parameters.Add("@Address", SqlDbType.NVarChar, 120).Value = address ?? "";
Run Code Online (Sandbox Code Playgroud)

此外,当您从代码执行查询时,在服务器上运行跟踪:(这是如何:http://databases.about.com/od/sqlserver/ht/trace.htm)

告诉我们执行结果是什么样的(你的sproc实际上是如何执行的)以及它是否被调用.

这里没有魔力.只有少数事情可以发生:

您没有执行您认为的相同版本的sproc或连接到错误的DB或服务器.检查sproc的架构.你确定你正在执行的sproc是dbo.并没有其他版本的参数更少,不是dbo?这让我有几次了.我会在错误的模式下意外修改/创建一个sproc,当我的代码没有指定哪个模式时,我正在登录的用户的默认模式将被执行.真的,你必须要追踪.这是这类事情的基本问题.您需要实际查看SQL正在尝试执行的内容.将该代码复制/粘贴到此处的评论部分.那段代码会给你同样的错误吗?我认为这是一个模式混乱,你有多个版本.听起来很粗鲁,但无论是那个还是你不在你认为的同一个服务器/ db上.发生在我们最好的人身上!:)

另一件事可能正在发生.主数据库中是否有该sproc的版本?如果是这样,请记住它将被执行,而不是您连接到的数据库中的任何sproc.检查主数据库.如果你在那里创建它,它的参数较少,那么这可能是你的问题.