2

我有一个插入存储过程,我想检查电子邮件是否已经存在,如果存在我必须向用户显示错误,但是如何抛出错误并在后面的代码中捕获它?

CREATE procedure [dbo].[SP_ProfileRegMaster]
    @UserId Varchar(50),
    @FirstName Varchar(50)
    @EmailID varchar (50)
    @result int out)
AS
BEGIN
    IF EXISTS (SELECT EmailId FROM Profile_Master WHERE EmailId = @EmailId)
    BEGIN
        SET @result = 0
    ELSE
       RAISERROR ('Email address does not exist.', 1, 1)
END

C#代码:

result = cmd1.Parameters.Add("@result", System.Data.SqlDbType.Int);
result.Direction = System.Data.ParameterDirection.Output;
4

4 回答 4

2

RAISERRORseverity只有当参数 >= 11时才会在应用程序中抛出异常。

您的代码设置severity为 1,这被归类为信息性消息,并且不会返回给应用程序。

于 2012-08-08T16:41:02.493 回答
1

正如我在评论中提到的那样,在您的情况下,我不会使用 RAISERROR() 。你可以这样做:

存储过程

CREATE procedure [dbo].[SP_ProfileRegMaster]
  @UserId  Varchar(50),
  @FirstName  Varchar(50)
  @EmailID varchar (50))
AS BEGIN
  if exists(select EmailId from Profile_Master where EmailId=@EmailId)
  begin
    return 0
  else
    return 1
  end
end

C# 代码

SqlConnection conn = new SqlConnection(getConnectionString())
SqlCommand cmd = new SqlCommand("SP_ProfileRegMaster", conn);
cmd.CommandType = CommandType.StoredProcedure;

// Pass parameters to Stored Proc...

// Add one more parameter to store the Return Value
var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;

conn.Open();
cmd.ExecuteNonQuery();
// Retrieve the return value
var result = returnParameter.Value;
于 2012-08-09T10:31:57.043 回答
0

如果您的结果只有 0 和 1,那么 @Result 应该有点,1 表示电子邮件地址存在,如果不存在,则为 0,那么您可以检查结果为真或假的代码。

编辑:

要使用 RAISEERROR,请使用以下命令

RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]

例如:

 RAISERROR ('Message',10,1)

10 是严重性,1 是状态

于 2012-08-08T15:19:38.470 回答
0

如果您真的想从 SQL 中抛出自定义错误,请使用RAISERROR,即

ELSE
     RAISERROR ('Email address does not exist.', 1, 1)

但是,从您的示例 SQL 中,您可以设置@Result为与成功值不同的值:

ELSE
    SET @Result = 1 --indicates an error

并检查@Result您的 C# 的值。

于 2012-08-08T15:16:50.240 回答