2011-06-12 51 views
0

我想获得一个插入/返回主键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不存在。

我该如何解决这个问题?

回答

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

+1来查明你自己。 – Pankaj 2011-06-13 08:25:36

1

您必须使用@前缀的所有参数的名字,所以这将工作:

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

我已经试过了仍然不起作用。确切的错误是“”参数化查询'(@email nvarchar(4000),@ username nvarchar(5),@ salt nvarchar(4000'期望参数'@email',它没有提供。“}” – Earlz 2011-06-12 21:01:08

+0

你能使用存储过程调用代码更新你的问题? – 2011-06-12 21:05:41

+0

这不是一个存储过程,所有这些都是作为查询来执行的,也就是我执行'cmd.CommandText =“declare ...”'。作为单个查询 – Earlz 2011-06-12 21:09:14

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