2010-10-21 5 views
3

У меня есть хранимая процедура, которая вызывается для проверки пользователя во время входа в систему. Если успех возвращает пользовательский объект, и это работает хорошо! Мой вопрос в том, что если это не сработает, я вызову ошибку в SP. Как я могу поймать эту ошибку и использовать ее наилучшим образом? Сейчас я получаю nullrefference, это код: процедура Магазин:Поймать ошибку из хранимой процедуры в C#

ALTER PROCEDURE getEmployee 
    (
    @username nvarchar(50), 
    @password nvarchar(50) 
    ) 
AS 
DECLARE @Error_MSG nvarchar(50) 
BEGIN 

IF EXISTS (select * from Employee where eUsername = @username AND pword = @password) 
begin 
    select * from Employee where eUsername = @username AND pword = @password 

    END 

    ELSE 
    BEGIN 
    SET @Error_MSG = 'Wrong password, or user doesnt exist' 
    RAISERROR (@Error_MSG, 11,1) 
    END 
END 

И в коде это выглядит так, СП является getEmployee

ActivityDatabaseDataContext dc = new ActivityDatabaseDataContext(); 
     Employee emp; 
     public bool logIn(string piUsername, string piPassword) 
     { 
      try 
      { 
       emp = dc.getEmployee(piUsername, piPassword).Single(); 
      } 
      catch (Exception ex) 
      { 
       errorMsg = ex.Message + ex.InnerException.Message; 
      } 
      if (emp != null) 
      { 
       AppHelper.AppHelper.setUser(emp); 
       return true; 
      } 
      else 
      { 
       return false; 
      } 

Мой вопрос, как я должен обрабатывать исключение?

ответ

4

Обычно я не вызывал ошибку из SP, если это не была проблема системы с операцией. Ввод неправильного имени пользователя и пароля - это проблема пользователя, и вам нужно иметь дело только на уровне интерфейса, поэтому я бы выбрал большую часть этого SP и рассмотрел два варианта использования (1 строка или 0 строк, возвращенных) в бизнес-уровня или кода интерфейса. Если 0 строк, подбросить "неправильный логин или пароль" сообщение клиенту и если 1, войдите в систему.

ALTER PROCEDURE getEmployee 
( 
    @username nvarchar(50), 
    @password nvarchar(50) 
) 
AS 
BEGIN 
    select * from Employee where eUsername = @username AND pword = @password 
END 
+0

Согласен! На самом деле это не «ошибка», и ее, безусловно, нельзя поднимать из базы данных. –

+0

Да, вы правы, это не ошибка, поэтому я должен ее поменять, но как я должен тогда бороться с SP, я все равно хочу вернуть полную сущность из db, если успех, но скажем 0, если ничего, как следует Я меняю свой SP?/Thanks – Fore

+0

Из вышеперечисленного proc вы можете проверить возвращаемое значение, чтобы увидеть, сколько его элементов содержит. Если это пустой набор, вы знаете, что есть проблема с именем пользователя/паролем. Если в нем есть 1 элемент, они могут войти в систему, и если есть несколько элементов (если вы считаете, что OCD необходимо проверить, так как БД должна обеспечить этот случай), тогда возникает серьезная проблема :-) – Kendrick

1

Ваше внутреннее исключение, вероятно, является нулевым.

Вы должны попытаться поймать и обработать определенные исключения, в данном случае SqlExceptions.

1
ALTER PROCEDURE getEmployee 
     (
     @username nvarchar(50), 
     @password nvarchar(50) 
     ) 
    AS 
    BEGIN 

    select * from Employee where eUsername = @username AND pword = @password 

    END 

...

SqlCommand cmd = new SqlCommand("getEmployee", conn); 
cmd.AddWithValue('@username', name); 
cmd.AddWithValue('@password', pass); 

SqlAdapter da = new SqlAdapter(cmd); 
DataSet ds= new DataSet(); 
da.Fill(ds); 

if (ds.Table.Count > 0 && ds.Table.Rows.Count == 1) { 
    // success 
} else { 
    // fail 
} 
+0

Просто примечание: «Верх 1» является избыточным, если eUsername уникально (и оно должно быть) в столбце, который не позволяет дублировать. Альтернативный способ взглянуть на это: если столбец не ограничен и возвращается более 1 строки, то это действительно системная ошибка. – Kendrick

+0

Вы правы насчет верха и других вещей. – signetro

1
IF(@Count>0) 
    BEGIN 
    SELECT @RetVal = 6 
     , @ErrMsg = 'A description with the same name exists. Please provide a unique name.' 
    GOTO ERROR    
    END 

Используйте встроенный StoredProcException в catch, что подразумевает:

 catch (StoredProcException spEx) 
     { 
      switch (spEx.ReturnValue) 
      { 
       case 6: 
        UserMessageException umEx= new UserMessageException(spEx.Message); 
        throw umEx; 
      } 
     } 

Вы можете передать мне ssage как строка вместо spEx.Message

+0

@ Soner-Gönül Я знаю, что это старый, но откуда вы взяли StoredProcException? Это не допустимое исключение C#. – Mike

+0

@Mike Этот ответ - не мой. Спросите Бхарата. –

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