4

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

由于我得到“程序或函数指定的参数太多”,经过两个长时间的搜索 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();
}
4

3 回答 3

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 是如何实际执行的)以及它是否被调用。

这里没有魔法。只有几件事可能发生:

您没有执行您认为自己或连接到错误数据库或服务器的相同版本的存储过程。检查存储过程的架构。你确定你正在执行的存储过程是 dbo. 并且没有另一个版本的参数更少不是 dbo 吗?这让我好几次了。我会不小心在错误的架构下修改/创建存储过程,当我的代码没有指定哪个架构时,我登录的用户默认的那个架构将被执行。确实,您必须进行跟踪。这是此类事情的基本故障排除。您需要实际查看 SQL 正在尝试执行什么。将该代码复制/粘贴到此处的评论部分。该代码是否给您同样的错误?我打赌这是一种模式混乱,你有多个版本。说起来很不礼貌,但是,或者您不在您认为的同一服务器/数据库上。发生在我们最好的人身上!:)

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

于 2013-11-13T23:14:13.363 回答
2

该错误实际上具有误导性和不正确性。

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

真正的问题是选择和更新存储过程必须有相同的参数,否则你会得到这个错误。真的不直观,我猜是典型的微软。

于 2016-10-15T16:00:29.090 回答
0

就我而言,我正在对一个 4 年多未更改的 WebForms 项目进行更改。

我正在更改 Visual Studio 中的数据库项目: 在此处输入图像描述

但实际上需要在 SQL Server Manager Studio 中进行更改: 在此处输入图像描述

然后在 SQL Server Manager Studio 中执行!

于 2017-07-28T18:47:58.950 回答