2017-02-21 52 views
0

Я использую dapper для доступа к SQL Server 2016. У меня есть таблица под названием Country с идентификатором автоинкремента, кодом и меткой. Чтобы добавить новую страну у меня есть хранимая процедура, описанные ниже в моей базе данных:Вставить идентификатор и специальное сообщение об ошибке из хранимой процедуры SQL Server

CREATE PROCEDURE [dbo].[AddNewCountry] 
( 
    @Code varchar (50), 
    @Label varchar (50) 
) 
AS 
BEGIN 
    INSERT INTO Country 
    VALUES(@Code,@Label) 
END 

я вызвать хранимую процедуру из хранилища:

public class EmpRepository  
{  
    public SqlConnection con; 

    private void connection()  
    {  
     string constr = ConfigurationManager.ConnectionStrings["SqlConn"].ToString();  
     con = new SqlConnection(constr);  

    }  
    //To Add Employee details  
    public void AddCountry(CountryModel objCountry) 
    {  
     try  
     {  
      connection();  
      con.Open();  
      con.Execute("AddNewCountry", objCountry, commandType: CommandType.StoredProcedure);  
      con.Close();  
     }  
     catch (Exception ex)  
     {  

      throw ex;  
     }  

    } 

Если я пытаюсь добавить страну, код которого уже существует I хотел бы указать конкретное сообщение об ошибке как «Страна уже существует» из хранимой процедуры.

Если страна добавлена, я бы хотел свернуть auto-incremented id.

Так что если кто-то знает, как отправить объект с идентификатором и ErrorMessage из хранимой процедуры, пожалуйста, скажите мне.

+1

Посмотрите на [RAISERROR] (https://msdn.microsoft.com/en-us/library/ms178592.aspx), который будет бросать исключение приложения к клиент. Вы можете указать параметры для вставки в строку ошибки, чтобы вы могли заполнить ее с помощью [SCOPE_IDENTITY] (https://msdn.microsoft.com/en-us/library/ms190315.aspx), которая будет содержать идентификатор с автоматическим увеличением , Хотя вы бы хотели, чтобы исключение, когда оно преуспевало, вне меня, вы должны просто вернуть значение. –

+1

Не используйте исключения для вещей, которые вы можете легко проверить в коде. Исключения основаны главным образом на вещах, которые вы не можете контролировать, например, сетевых ошибок и т. Д. ». Просто проверьте, существует ли значение в таблице. Вы можете использовать выходные параметры, чтобы указать, не завершилась или не удалась хранимая процедура. –

+0

Я никогда не говорил boolean ... вы можете вернуть значение int и текстовое значение. Я сейчас не рядом с компьютером, поэтому я не могу показать вам какую-нибудь треску. –

ответ

0

Как уже сказал Зоар Пелед, я бы не стал исключать здесь. Просто обрабатывайте возвращаемые сообщения в процедуре.

Вот пример:

CREATE PROCEDURE [dbo].[AddNewCountry] 
( 
    @Code varchar (50), 
    @Label varchar (50), 
    @Message VARCHAR OUTPUT, 
    @ID INT OUTPUT 
) 
AS 
BEGIN 
    IF NOT EXISTS (SELECT 1 FROM Country WHERE Code = @Code) 
    BEGIN 
     INSERT INTO Country VALUES(@Code,@Label) 
     SET @ID = @@IDENTITY 
     SET @Message = 'Code inserted' 
    END 
    ELSE 
    BEGIN 
     SET @ID = 0 
     SET @Message = 'Code already exists' 
    END 

    SELECT @Message, @ID 
END 
+0

Спасибо, именно то, что мне нужно. Могу ли я спросить вас, почему вы поставили @@ IDENTITY, а не SCOPE_IDENTITY(), поскольку @John Wu предложил? – Hans

+0

Я бы не пошел с '@@ IDENTITY' здесь. лучший вариант - это, вероятно, использование предложения вывода с инструкцией insert. Кроме того, вам следует как читать сообщение в блоге Dan Guzman (условное вложение). (Http://weblogs.sqlteam.com/dang/archive/2007/10/28/Conditional-INSERTUPDATE-Race-Condition.aspx) –

+0

Просто В этом примере нет разницы между SCOPE_IDENTITY и @@ IDENTITY, поскольку вы изменяете только одну таблицу. Если вы измените несколько таблиц и используете триггеры, вы должны быть осторожны. Дополнительная информация здесь: https://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/ – RoundFour

 Смежные вопросы

  • Нет связанных вопросов^_^