【发布时间】:2015-01-31 03:43:27
【问题描述】:
我在更新时遇到了一些问题。我必须构建我的自定义选择,所以我无法进行动态查询。我一直在尝试使用下面显示的代码更新我的数据库,但我总是收到此错误:
过程或函数 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;
【问题讨论】:
-
尝试指定参数包括
@?例如。.Add("@roleId", ""); -
不要waste guids! -
Guid guid = Guid.Empty(); -
查找如何使用
Parameter.Add() Function vs the Parameter.AddWithValue() Function您还需要指定DataType您使用它的方式 我会将Add更改为AddWithValue这样数据库可以处理解析数据类型 -
@asawyer
new Guid()给你000-000...- 还剩下很多! -
不要使用异常处理来设置 guid,而是考虑使用 TryParse(仅 2 行代码):
Guid guid; Guid.TryParse(Session["user_id"].ToString(), out guid);
标签: c# asp.net sql-server