[英]Procedure has too many arguments specified
我在更新中遇到了一些问题。 我必须构建自己的自定义选择,因此无法进行动态查询。 我一直在尝试使用下面显示的代码更新数据库,但是我总是会收到此错误:
过程或函数UpdateUser指定了太多参数。
我已经填满了所有论点,没有更多,没有更少....怎么了?
ASPX标记:
<asp:SqlDataSource ID="AllUsers" runat="server"
ConnectionString="<%$ ConnectionStrings:LocalSQL %>"
SelectCommand="TodosOsUtilizadores" SelectCommandType="StoredProcedure">
</asp:SqlDataSource>
C#代码背后:
using (SqlDataSource ds = AllUsers)
{
Guid guid = new Guid();
try
{
guid = Guid.Parse(Session["user_id"].ToString());
}
catch
{
guid = Guid.NewGuid();
}
ds.UpdateCommand = "UpdateUser";
ds.ConflictDetection = ConflictOptions.OverwriteChanges;
ds.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure;
ds.UpdateParameters.Add("userid", guid.ToString());
ds.UpdateParameters.Add("username", "Diogo");
ds.UpdateParameters.Add("email", "user_test@gmail.com");
ds.UpdateParameters.Add("isAnonimo", "0");
ds.UpdateParameters.Add("isLocked", "0");
ds.UpdateParameters.Add("roleId", "");
ds.Update();
DetailsView1.DataBind();
}
存储过程:
CREATE PROCEDURE [dbo].UpdateUser
@userid nvarchar(max),
@username nvarchar(200),
@email nvarchar(500),
@isAnonimo bit,
@isLocked bit,
@roleid nvarchar(max)
AS
UPDATE Memberships
SET Email = @email,
IsLockedOut = @isLocked
WHERE
UserId = CAST(@userid as uniqueidentifier);
UPDATE Users
SET UserName = @username,
IsAnonymous = @isAnonimo
WHERE
UserId = CAST(@userid AS uniqueidentifier);
IF (@roleid IS NULL)
BEGIN
UPDATE UsersInRoles
SET RoleId = CAST(roleid AS uniqueidentifier);
END;
问题在于SqlDataSource
工作方式,特别是ConflictDetection
。
正如MSDN所说 :
ConflictDetection
属性确定旧值和新值的参数是否应用于Update方法。 例如,如果由SelectCommand
属性指定的命令返回带有Name和Number列的DataTable
对象,并且ConflictDetection
属性设置为OverwriteChanges
值, 则会为Update
方法的Name和Number创建参数。
因此,如果您的SelectCommand
返回例如firstname
,则UpdateCommand
已经存在一个firstname
参数,这就是导致错误的原因。
不知道它是否会起作用,但是一个简单的尝试是首先清除UpdateParameters
集合:
using (SqlDataSource ds = AllUsers)
{
Guid guid = new Guid();
try
{
guid = Guid.Parse(Session["user_id"].ToString());
}
catch { guid = Guid.NewGuid(); }
ds.UpdateCommand = "UpdateUser";
ds.ConflictDetection = ConflictOptions.OverwriteChanges;
ds.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure;
ds.UpdateParameters.Clear();
ds.UpdateParameters.Add("userid", guid.ToString());
ds.UpdateParameters.Add("username", "Diogo");
ds.UpdateParameters.Add("email", "user_test@gmail.com");
ds.UpdateParameters.Add("isAnonimo", "0");
ds.UpdateParameters.Add("isLocked", "0");
ds.UpdateParameters.Add("roleId", "");
ds.Update();
DetailsView1.DataBind();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.