2010-07-05 2 views
3

comment écrire une instruction if else pour insérer la requête pour montrer l'erreur dans la procédure stockéecomment écrire une instruction if else pour insérer la requête pour montrer l'erreur dans la procédure stockée

ci-dessous est mon procedure.I stocké veulent montrer un message d'erreur quand déjà inséré student_id est inséré à nouveau..Student_id est la clé primaire donc son erreur de show dans mon code mais je dono comment obtenir cette erreur et montrer .... comment faire des amis plz m'aider .....

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

Avec quoi appelez-vous le sproc? C#? Autre chose? S'il vous plaît nous montrer ce code ... –

+0

vous utilisez avec C# seulement – Lingesh

Répondre

0

Vous pouvez ajouter un paramètre de sortie (int/bit) dans Sp et définir la valeur de ce paramètre, que l'enregistrement existe ou non. Vous pouvez ensuite vérifier la valeur du paramètre de sortie dans Front End. Ci-dessous, j'ai ajouté un paramètre de sortie @RecordExist en tant que bit et en réglant la valeur 1 lorsque l'enregistrement existe déjà, sinon le réglage 0. À l'avant, vous pouvez obtenir la valeur de paramètre de SqlCommand après avoir exécuté le Sp. (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

Vous pouvez ajouter un paramètre de sortie en haut de votre SP:

@ErrorOutput INT OUTPUT 

Puis ajouter:

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

Hmmm, pourquoi @@ ERROR contiendrait un code d'erreur ici? –

+0

@Alek Davis: Merci d'avoir signalé cela. Avoir modifié ma réponse. –

0

Comme « codeka » Dean Harding mentionné dans le commentaire, il serait utile de savoir comment vous appelez la procédure stockée. Mais voici quelques suggestions générales. Tout d'abord, une convention commune pour les procédures stockées est de retourner 0 en cas de succès et une valeur non nulle en cas d'erreur (vous pouvez utiliser un paramètre de sortie pour les codes d'erreur, mais c'est en quelque sorte redondant). Deuxièmement, avant d'essayer d'insérer une valeur, vous devez vérifier si elle existe déjà. Par exemple. voici quelques pseudo-code:

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 

Notez que dans cet exemple, le code T-SQL quitte après avoir appelé raiserror, de sorte que vous devez gérer cela comme une exception si vous appelez la procédure stockée de C#/VB.NET/etc. Alternativement, vous pouvez omettre l'appel raiserror et faire en sorte que le proc stocké renvoie un code d'erreur attendu (par le client).

Ensuite, il y a encore une possibilité mineure qu'un duplicata soit inséré, mais je pense qu'il génèrerait une erreur fatale que vous auriez besoin de gérer dans le code client (la gestion des erreurs dépend du client, en C#, vous obtiendrez probablement une exception SqlException que vous pouvez interroger pour un code spécifique).

Une autre option consisterait à mettre un transaction autour du code qui vérifie l'enregistrement existant et en insère un nouveau.

Si vous voulez gérer une erreur en C#, vous devez prendre en charge deux choses. Tout d'abord, vérifiez le code de retour et traitez les valeurs non nulles en conséquence (le client C# et le proc stocké doivent se mettre d'accord sur la signification de chaque code d'erreur). Ensuite, vous devez également gérer SqlExceptions. Les propriétés State et Number de l'objet SqlException peuvent vous aider à identifier le problème. Gardez à l'esprit que pour les messages d'erreur définis à la volée (comme dans mon exemple), Number retournera toujours 50 000 (je pense).

Questions connexes