C# 检查电子邮件ID是否重复

C# 检查电子邮件ID是否重复,c#,asp.net,sql-server,stored-procedures,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 (5

我正在使用存储过程检查电子邮件的副本

     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。如何解决这个问题?

调用将返回受影响的行数。在添加输出参数时,您应该访问此参数

// 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

使用带有StoredProc返回值-1的
ExecuteOnQuery
。这是预期的行为

将代码更改为

if exists(select EmailId from Profile_Master where EmailId=@EmailId)
   select 0 as result
else
   select 1 as result
C#,不再需要在此处传递参数

var id = cmd1.ExecuteScalar();

由于您使用的是输出参数,因此还可以使用@Pilgerstorfer Franz的方法

id
不是一个
id
,而是自使用以来受影响的行数,而不是您应该在
ExecuteNonQuery
之后检查
result
,以获取输出变量

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

这是我们的预期行为。 您的查询不会影响任何行

对于UPDATE、INSERT和DELETE语句,返回值为 受命令影响的行数。当触发器存在于 在插入或更新表时,返回值包括数字 受插入或更新操作和编号影响的行数 受一个或多个触发器影响的行数。对于所有其他类型的 语句,返回值为-1。如果发生回滚,则返回 值也为-1

结果如下:

result = cmd1.Parameters.Add("@result", System.Data.SqlDbType.Int);
result.Direction = System.Data.ParameterDirection.Output;
cmd1.ExecuteNonQuery();
var id = result.Value;
请尝试:

cmd1.ExecuteScalar();
var id=Convert.ToInt32(result.Value);

什么是rdbms、SQL Server xxxx?请相应地标记它。同时向我们显示SP的sql(至少是输出变量的相关部分)。此外,
id
不是
id
而是受影响的行数,因为您使用的是
ExecuteNonQuery
而不是
ExecuteScalar
您应该在
ExecuteNonQuery
之后检查
result
,以获取输出变量。@result是一个输出参数。完全重写我的答案,请检查一下,并给一些反馈,但我必须返回id返回id;如果我使用executescalar,我会出错。我可以看到你已经更新了你的问题。我没有看到为什么要使用executescalar而不是ExecuteOnQuery???
ExecuteOnQuery
可以,但返回的值是受插入、删除和更新影响的行数。对于PROC,它总是-1。若要从PROC返回值,请使用所指出的输出参数
ExecuteScalar
返回第一部分第一行的第一列ExecuteNonQuery后是否检查结果??我很困惑。是的,两部分都有。在检查
结果
输出变量之前,需要先执行
ExecuteNonQuery
ExecuteScalar