2010-07-05 79 views
3

误差怎么写,如果else语句用于显示在存储过程中的错误插入查询如何编写的if else语句插入查询显示存储过程

下面

是我的存储procedure.I希望显示一个错误消息,当已经插入student_id再次插入..Student_id是主键,所以它显示错误在我的代码,但我dono如何得到该错误和显示....如何做朋友plz帮助我.....

ALTER PROCEDURE [dbo].[spinsertstudentapplication] 
    -- Add the parameters for the stored procedure here 
    @Student_id    nvarchar(50), 
    @Select_Country   nvarchar(50), 
    @Select_State   nvarchar(50), 
    @Select_Franchise  nvarchar(50), 
    @Select_Sensei   nvarchar(50), 
    @Enter_Student_Name  nvarchar(50), 
    @Enter_Student_Address nvarchar(50), 
    @Students_Father_Name nvarchar(50), 
    @Student_DOB   datetime, 
    @Gender     bit, 
    @Group     nvarchar(50), 
    @Enter_Kyu    nvarchar(50) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    insert into StudentApplication(Student_id,Select_Country,Select_State,Select_Franchise,Select_Sensei,Enter_Student_Name,Enter_Student_Address,Students_Father_Name,Student_DOB,Gender,[Group],Enter_Kyu)values(@Student_id,@Select_Country,@Select_State,@Select_Franchise,@Select_Sensei,@Enter_Student_Name,@Enter_Student_Address,@Students_Father_Name,@Student_DOB,@Gender,@Group,@Enter_Kyu) 

END 
+1

你叫什么呢? C#?还有别的吗?请向我们展示代码... – 2010-07-05 05:48:23

+0

ya正在使用C#only – Lingesh 2010-07-05 06:00:24

回答

0

无论记录是否存在,您都可以在Sp中添加输出参数(int/bit)并将该值设置为该参数。然后您可以检查前端的输出参数值。在下面,我添加了一个输出参数@RecordExist作为bit,并且当记录已经存在时将值设置为1,否则设置为0.在执行Sp之后,您可以从前端获得SqlCommand的参数值。 (SqlCommand.Parameters["@RecordExist"].Value

ALTER PROCEDURE [dbo].[spinsertstudentapplication] 
    -- Add the parameters for the stored procedure here 
    @Student_id    nvarchar(50),  
    @Select_Country   nvarchar(50), 
    @Select_State   nvarchar(50), 
    @Select_Franchise  nvarchar(50), 
    @Select_Sensei   nvarchar(50), 
    @Enter_Student_Name  nvarchar(50), 
    @Enter_Student_Address nvarchar(50), 
    @Students_Father_Name nvarchar(50), 
    @Student_DOB   datetime, 
    @Gender     bit, 
    @Group     nvarchar(50), 
    @Enter_Kyu    nvarchar(50), 
    @RecordExist   bit output -- newly added parameter 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 

If Exists (Select * from StudentApplication where Student_id = @Student_id) 
    Begin 
     Select @RecordExist = 1 
     return 
    End 

Else 
    Begin 
     insert into StudentApplication (Student_id, Select_Country, Select_State, Select_Franchise, Select_Sensei, Enter_Student_Name, Enter_Student_Address, Students_Father_Name, Student_DOB, Gender, [Group], Enter_Kyu) 

     Select @Student_id, @Select_Country, @Select_State, @Select_Franchise, @Select_Sensei, @Enter_Student_Name, @Enter_Student_Address, @Students_Father_Name, @Student_DOB, @Gender, @Group, @Enter_Kyu 

     Select @RecordExist = 0 
     return 
    End 

END 
0

您可以在SP的顶部添加一个输出参数:

@ErrorOutput INT OUTPUT 

然后加:

IF EXISTS (SELECT 1 FROM StudentApplication WHERE [email protected]_id) 
    SET @ErrorOutput = -1; 
    RETURN @ErrorOutput; 
ELSE 
    -- Insert statement 
+0

嗯,为什么@@ ERROR包含此处的错误代码? – 2010-07-05 05:52:58

+0

@Alek Davis:谢谢你指出。修改了我的答案。 – 2010-07-05 07:52:47

0

作为院长codeka“哈丁在评论中提到,这将有助于了解你是如何调用存储过程。但是这里有一些一般性的建议。

首先,存储过程的一个通用惯例是成功时返回0,错误时返回非零值(您可以使用输出参数作为错误代码,但它有点冗余)。

其次,在试图插入一个值之前,你应该检查它是否已经存在。例如。这里是一些伪代码:

if exists (select 1 from StudentApplication where Student_ID = @Student_ID) 
begin 
    raiserror('Student ID already exists.', 16, 1) 
    return 1 -- Your caller would need to know that 1 identifies existing record 
end 

注意,在这个例子中,T-SQL代码中调用RAISERROR后退出,所以你需要处理这是一个例外,如果你调用从C#/ VB.NET /存储的过程等等或者,您可以省略raiserror调用,只需要存储过程返回预期的(由客户端)错误代码。

然后还有一个小的可能性,即重复会被插入,但我认为,这将产生一个致命的错误,你就需要在客户端代码来处理(错误处理是依赖于客户端;在C#中,你可能会得到一个SqlException,你可以查询特定的代码)。

另一种选择是将transaction放在检查现有记录的代码周围,然后插入一个新的记录。

如果您想在C#中处理错误,您需要处理两件事情。首先,检查返回代码并相应地处理非零值(C#客户端和存储过程必须就每个错误代码的含义达成一致)。然后,您还需要处理SqlExceptions。 SqlException对象的StateNumber属性可以帮助您识别问题。请记住,对于即时定义的错误消息(如我的示例),Number一直会返回50,000(我认为)。