2010-07-05 82 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(我認爲)。