参数不存在时出错?

时间:2011-06-12 20:52:55

标签: c# sql-server sql-server-2008 parameters

我正在尝试运行插入/返回主键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不存在但此时会抛出错误。

如何解决此问题?

3 个答案:

答案 0 :(得分:2)

我已经弄清楚了。如果发送给定null作为参数的值,则实际上不会添加它。所以解决方案(无论如何,对我而言,它可能涉及DBNull)是将空值转换为空字符串,如下所示:

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 ?? ""));

答案 1 :(得分:1)

您必须在所有参数名称前加@前缀,这样才能生效:

cmd.Parameters.Add(new SqlParameter("@email",user.EmailAddress));

答案 2 :(得分:0)

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
)

或者

Commit/Rollback Transaction