我正在使用存储过程
检查重复的电子邮件 ALTER procedure [dbo].[Insertreg]
( @id int output,@FirstName varchar (50),@LastName varchar(50) ,@Dob datetime,
@Gender varchar(20) ,@MobileNo nchar(10) ,@Country varchar(50) ,
@State varchar (50),@EmailId varchar (50),@Password nchar (15),@result int output
)
as
begin
if exists(select EmailId from Profile_Master where EmailId=@EmailId)
set @result=0
else
begin
set @result=1
insert into Profile_Master(FirstName,LastName,Dob,Gender,MobileNo,Country,State,EmailId,Password)
values
(@FirstName,@LastName,@Dob,@Gender,@MobileNo,@Country,@State,@EmailId,@Password)
set @id=SCOPE_IDENTITY()
return
end
end
背后的代码
result = cmd1.Parameters.Add("@result", System.Data.SqlDbType.Int);
result.Direction = System.Data.ParameterDirection.Output;
var id = cmd1.ExecuteNonQuery();
但当我调试如果emailid存在我得到id值为-1我该如何解决这个问题?
答案 0 :(得分:0)
调用ExecuteNonQuery()将返回受影响的行数。正如您添加了 outputParameter ,您应该访问这个。
// access an output parameter
cmd1.ExecuteNonQuery();
var id = cmd1.Parameters["@result"].Value;
// OR: get the returnValue of a SP
var id = cmd1.ExecuteScalar();
修改强>
使用此版本的sp
怎么样?ALTER procedure [dbo].[Insertreg]
( @FirstName varchar (50),@LastName varchar(50) ,@Dob datetime,
@Gender varchar(20) ,@MobileNo nchar(10) ,@Country varchar(50),
@State varchar (50),@EmailId varchar (50),@Password nchar (15))
as
begin
if exists(select EmailId from Profile_Master where EmailId=@EmailId)
select -1;
else
begin
insert into Profile_Master(FirstName,LastName,Dob,Gender,MobileNo,Country,State,EmailId,Password)
values (@FirstName,@LastName,@Dob,@Gender,@MobileNo,@Country,@State,@EmailId,@Password)
select SCOPE_IDENTITY();
end
end
只有使用
// no need for any output Parameters here...
int id = int.Parse(cmd1.ExecuteScalar().ToString())
访问您的ID值。如果给定的邮件是唯一的,则值将大于-1;如果已经存在电子邮件,则值将大于-1!
答案 1 :(得分:0)
将ExecuteNonQuery
与StoredProc一起使用返回-1。这是预期的行为。
将您的代码更改为
if exists(select EmailId from Profile_Master where EmailId=@EmailId)
select 0 as result
else
select 1 as result
C#,你不需要再在这里传递参数了
var id = cmd1.ExecuteScalar();
由于您使用的是OUTPUT参数,您还可以使用@Pilgerstorfer Franz的方法
答案 2 :(得分:0)
id
不是Id
,而是受影响的行数,因为您使用的是ExecuteNonQuery
而不是ExecuteScalar
您应该在result
之后检查ExecuteNonQuery
{1}}获取输出变量。
result = cmd1.Parameters.Add("@result", System.Data.SqlDbType.Int);
result.Direction = System.Data.ParameterDirection.Output;
int numberOfAffectedRecords = (int)cmd1.ExecuteNonQuery();
// now result should have the output variable
如果您想拥有新创建的ID,则应使用ExecuteScalar
:
result = cmd1.Parameters.Add("@result", System.Data.SqlDbType.Int);
result.Direction = System.Data.ParameterDirection.Output;
int newID = (int)cmd1.ExecuteScalar();
// now result should have the output variable
答案 3 :(得分:0)
这是ExecuteNonQuery的预期行为。 您的查询不会影响任何行。
对于UPDATE,INSERT和DELETE语句,返回值为 受命令影响的行数。当a上存在触发器时 正在插入或更新的表,返回值包括数字 受插入或更新操作影响的行数和数字 受触发器或触发器影响的行数。对于所有其他类型的 语句,返回值为-1。如果发生回滚,则返回 值也是-1。
您得到的结果如下:
result = cmd1.Parameters.Add("@result", System.Data.SqlDbType.Int);
result.Direction = System.Data.ParameterDirection.Output;
cmd1.ExecuteNonQuery();
var id = result.Value;
答案 4 :(得分:0)
请尝试:
cmd1.ExecuteScalar();
var id=Convert.ToInt32(result.Value);