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

时间:2013-10-28 18:00:00

标签: c# sql stored-procedures

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

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

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

这是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();
}

3 个答案:

答案 0 :(得分: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 ?? "";

此外,从代码执行查询时,在服务器上运行跟踪: (方法如下:http://databases.about.com/od/sqlserver/ht/trace.htm

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

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

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

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

答案 1 :(得分:1)

错误实际上是误导和错误。

  

过程或函数指定的参数太多

真正的问题是选择和更新存储过程必须具有相同的参数,否则您将收到此错误。真的不直观,我想是典型的微软。

答案 2 :(得分:0)

就我而言,我正在对WebForms项目进行更改,该项目已经超过4年未被更改。

我正在对Visual Studio中的数据库项目进行更改: enter image description here

但实际上需要在SQL Server Manager Studio中进行更改: enter image description here

然后在SQL Server Manager Studio中执行!