Как передать исключение из хранимой процедуры в мой метод Post Action - PullRequest
3 голосов
/ 15 марта 2012

У меня есть метод Folloiwng Post Action, который передает два параметра в метод репозитория: -

 [HttpPost]
        public void Delete(string id, int classid )
        {
            repository.Deleteuserclass(id, classid);        }

где метод хранилища: -

public void Deleteuserclass(string a, int u)

    {
        entities.deleteuserclass(a,u);}

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

ALTER PROCEDURE dbo.deleteuserclass
@userid nvarchar(50),
@classid int
AS
Begin

Delete from Users_Classes where UserID = @userid  AND ClassID = @classid
END

Как я могу передать исключение в метод действия, который будет вызван на стороне базы данных, если хранимая процедура не удаляла ни одной записи?

Edit: - я обновляю хранимую процедуру следующим образом: -

ALTER PROCEDURE dbo.deleteuserclass
@userid nvarchar(50),
@classid int
AS
Begin

Delete from Users_Classes where UserID = @userid  AND ClassID = @classid
if @@rowcount = 0     
    Raiserror('No record deleted',1,16) 
END

и я обновил метод действия: -

        public ActionResult Delete(string id, int classid ) {
try{
                       Thread.Sleep(1000);
                       Users_Classes u_c = r.FindUserClass(id, classid);
                       r.Deleteuserclass(id, classid);
                       return Json(new { IsSuccess = "True", id = u_c.UserID + u_c.AddedDate.ToString("ddMMyyyyHHmmss"), name = u_c.UserID }, JsonRequestBehavior.AllowGet);
                   }
                   catch (ArgumentNullException)
                   {
                       return Json(new { IsSuccess = "F1" }, JsonRequestBehavior.AllowGet);}
                   catch (DbUpdateConcurrencyException)
                   {return Json(new { IsSuccess = "F2" }, JsonRequestBehavior.AllowGet); }
                   catch (NullReferenceException)
                   {return Json(new { IsSuccess = "F4" }, JsonRequestBehavior.AllowGet); }
                   catch (Exception e)
                   {return Json(new { IsSuccess = "F5" }, JsonRequestBehavior.AllowGet);}

но проблема в том, что если хранимая процедура не удаляла какую-либо запись, приложение вызовет исключение folloiwng NullReferenceException на return Json(new { IsSuccess = "True", id = u_c.UserID + u_c.AddedDate.ToString("ddMMyyyyHHmmss"), name = u_c.UserID }, JsonRequestBehavior.AllowGet); ,, и оно не вызовет исключение, которое уже должно быть вызвано для хранимой процедуры уровень 'No record deleted' ,, до достижения return статуса .. так в чем может быть проблема?

Ответы [ 2 ]

4 голосов
/ 15 марта 2012

То, что вы хотите сделать, это передать возвращаемое значение из вашей хранимой процедуры, которое является нерегулярным.Вы бы изменили свой хранимый процесс примерно так:

ALTER PROCEDURE dbo.deleteuserclass
@userid nvarchar(50),
@classid int
AS
Begin

Delete from Users_Classes 
where UserID = @userid  
AND ClassID = @classid

if @@rowcount = 0
    return -1

END

Я не уверен, как вы вызываете хранимую процедуру (не очень знаком с EF), но вы должны быть в состоянии получить возвратзначение:

// notice this method now returns bool instead of void
public bool Deleteuserclass(string a, int u)
{
    return entities.deleteuserclass(a,u) > 0;
}

А затем в вашем методе действия POST просто протестируйте результат bool метода DeleteUserClass():

[HttpPost]
public void Delete(string id, int classid )
{
    if (!repository.Deleteuserclass(id, classid))
        // no user deleted, handle accordingly        
}
0 голосов
/ 15 марта 2012

измените хранимую процедуру как

ALTER PROCEDURE dbo.deleteuserclass 
  @userid nvarchar(50), 
  @classid int 
AS 
Begin  
  Delete from Users_Classes  where UserID = @userid   AND ClassID = @classid  

  if @@rowcount = 0     
    Raiserror('User Deletion failed',1,16)
END 

Обработайте исключение и повторите метод репозитория

public void Deleteuserclass(string a, int u)      
{
  try{
         entities.deleteuserclass(a,u);
  }catch(Exception e)
  {
    throw e;
  }
} 

наконец, измените вызывающий метод как

public bool Deleteuserclass(string a, int u) 
{
    try{
     return entities.deleteuserclass(a,u) > 0; 
    }
    catch(Exception e)
    {
      //handle exception
      logError(e.Message);
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...