我正在尝试运行插入/返回主键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字段。所以这是作为单个查询执行的
然后我添加如下参数:(cmd
是SqlCommand
个对象)
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不存在但此时会抛出错误。
如何解决此问题?
答案 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
)
或者