Как написать оператор if else для вставки запроса для отображения ошибки в хранимой процедуре - PullRequest
3 голосов
/ 05 июля 2010

как написать оператор if else для вставки запроса для отображения ошибки в хранимой процедуре

ниже - это моя хранимая процедура. Я хочу показать сообщение об ошибке, когда уже вставленный student_id вставляется снова..Student_id isпервичный ключ, так что его ошибка показа в моем коде, но я не знаю, как получить эту ошибку и показать .... как сделать, друзья 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

Ответы [ 3 ]

0 голосов
/ 05 июля 2010

Как отметил в комментарии Дин Хардинг «Кодека», было бы полезно узнать, как вы вызываете хранимый процесс. Но вот несколько общих предложений.

Во-первых, общепринятым соглашением для хранимых процедур является возврат 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 / etc. В качестве альтернативы вы можете опустить вызов raiserror и просто сохранить сохраненный процесс, возвращающий ожидаемый (клиентом) код ошибки.

Тогда есть небольшая вероятность того, что дубликат будет вставлен, но я думаю, что это приведет к фатальной ошибке, которую вам нужно будет обработать в клиентском коде (обработка ошибок зависит от клиента; в C # вы вероятно, получит SqlException, который вы можете запросить для конкретного кода).

Другой вариант - поместить транзакцию вокруг кода, который проверяет существующую запись, а затем вставляет новую.

Если вы хотите обработать ошибку в C #, вам нужно позаботиться о двух вещах. Сначала проверьте код возврата и обработайте ненулевые значения соответственно (клиент C # и хранимый процесс должны согласовать значение каждого кода ошибки). Затем вам также нужно обработать SqlExceptions . Свойства State и Number объекта SqlException могут помочь вам определить проблему. Имейте в виду, что для сообщений об ошибках, определенных на лету (как в моем примере), Number всегда будет возвращать 50 000 (я думаю).

0 голосов
/ 05 июля 2010

Вы можете добавить выходной параметр (int / bit) в Sp и установить значение для этого параметра независимо от того, существует запись или нет.Затем вы можете проверить значение выходного параметра в Front End.Ниже я добавил выходной параметр @RecordExist как bit и установил значение 1, когда запись уже существует, в противном случае установил 0. В интерфейсе вы можете получить значение параметра из SqlCommand после выполнения 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 голосов
/ 05 июля 2010

Вы можете добавить выходной параметр в верхней части вашего SP:

@ErrorOutput INT OUTPUT

Затем добавьте:

IF EXISTS (SELECT 1 FROM StudentApplication WHERE Student_id=@Student_id)
    SET @ErrorOutput = -1;
    RETURN @ErrorOutput;
ELSE
    -- Insert statement
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...