检查重复的电子邮件ID

时间:2012-09-14 07:04:57

标签: c# asp.net sql-server stored-procedures

我正在使用存储过程

检查重复的电子邮件
     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我该如何解决这个问题?

5 个答案:

答案 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);