0

我正在检查使用存储过程通过电子邮件发送的重复文件

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

4

5 回答 5

0

请试试:

cmd1.ExecuteScalar();
var id=Convert.ToInt32(result.Value);
于 2012-09-14T07:21:26.437 回答
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!

于 2012-09-14T07:12:52.383 回答
0

与 StoredProc 一起使用ExecuteNonQuery返回 -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 的方法

于 2012-09-14T07:13:41.803 回答
0

id不是一个,Id而是受影响的行数,因为您使用的是ExecuteNonQuery而不是ExecuteScalar您应该检查result之后ExecuteNonQuery以获取输出变量。

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
于 2012-09-14T07:17:34.660 回答
0

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

对于 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;
于 2012-09-14T07:18:42.183 回答