参数不存在时出错

本文关键字:出错 不存在 参数 | 更新日期: 2023-09-27 17:59:10

我正在尝试运行插入/返回主键SQL查询。

查询结果如下:

declare @userid as integer;
insert into users (username,emailaddress,passwordhash,salt) values
 (@username,@email,@password,@salt);
set @userid=scope_identity();
insert into groups (name,userid) values ('somegroup',@userid);
select @userid;

这只是进入SqlCommand。CommandText字段。因此,这是作为单个查询执行的

然后我添加这样的参数:(cmdSqlCommand对象)

cmd.Parameters.Add(new SqlParameter("@email",user.EmailAddress));
cmd.Parameters.Add(new SqlParameter("@username",user.Username));
cmd.Parameters.Add(new SqlParameter("@salt",user.Salt));
cmd.Parameters.Add(new SqlParameter("@password", user.PasswordHash));

然后,我用ExecuteScalar();执行查询。它会在这一点上抛出一个错误,尽管它说参数@email不存在。

如何解决此问题?

参数不存在时出错

我已经想通了。如果您发送give null作为参数的值,它实际上不会被添加。因此,解决方案(无论如何,对我来说,对你来说,它可能涉及DBNull)是将null转换为空字符串,如下所示:

cmd.Parameters.Add(new SqlParameter("@email",user.EmailAddress ?? ""));
cmd.Parameters.Add(new SqlParameter("@username",user.Username));
cmd.Parameters.Add(new SqlParameter("@salt",user.Salt ?? ""));
cmd.Parameters.Add(new SqlParameter("@password", user.PasswordHash ?? ""));

您必须在所有参数名称前面加一个@,这样才能工作:

cmd.Parameters.Add(new SqlParameter("@email",user.EmailAddress));
using (TransactionScope scope = new TransactionScope())
{
      //Your code should be here in this case, as you are not using SP. 
      //So this will help you in case of multiple users
)

提交/回滚事务