0

SQL 데이터베이스를 쿼리하기 위해 Linq에서 Sql으로 C# MVC 웹 응용 프로그램을 빌드합니다. 죽음의 노란색 화면이 나타나지 않도록 데이터베이스를 오프라인으로 전환해야하는 경우 예외를 잡으려고합니다.데이터베이스가 오프라인 일 때 LinqToSql 예외 처리

디버깅 후 두 가지를 발견했습니다. 첫째, DataContext의 생성은 SQL 서버가 사용 가능한지 확인하지 않습니다. 둘째, 행 변수에 저장된 오류 메시지 (또는 예외!)가 있습니다.

아래 코드의 Catch 문에는 절대로 도달하지 않습니다. 따라서 뷰에서 모델의 데이터를 읽으려고 할 때 나는 죽음의 노란색 화면을 얻습니다.

왜 캐치 선언에 도달하지 않았습니까?

코드 : @ofir 당신이 LINQ 문을 실행하기 위해 .ToList() 메소드를 호출해야 언급 한 바와 같이 :

 try 
     { 
      //Creating DB Context 
      var con = ConfigurationManager.ConnectionStrings["teststring"].ConnectionString; 
      TestDataContext db = new TestDataContext(con); 

      //Querying database. This should cause an exception to be thrown!? 
      var rows = from s in db.Table 
         orderby s.Id descending 
         select s; 

      //Returning the View with the data 
      return View(rows); 
     } 
     catch (Exception ex) 
     { 
      ErrorInfo err = new ErrorInfo("Something went wrong when trying to query the database. See the log for details."); 
      err.WriteToErrorLog(ex); 
      return View("Error", err); 
     } 
+2

실행이 취소 된 상태에서 db에 대한 실제 호출이 뷰에 있습니다. 먼저 그것을 구체화해야합니다. '.ToList()'를 추가하고 뷰에 목록을 보냅니다. –

+0

Thx @OfirWinegarten. 그것은 받아 들여진 대답이어야합니다. – Andreas

답변

0

하면되는 SQLException

첫째
try 
    { 
     //Creating DB Context 
     var con = ConfigurationManager.ConnectionStrings["teststring"].ConnectionString; 
     TestDataContext db = new TestDataContext(con); 

     //Querying database. This should cause an exception to be thrown!? 
     var rows = from s in db.Table 
        orderby s.Id descending 
        select s; 

     //Returning the View with the data 
     return View(rows); 
    } 
    catch (SqlException ex) 
    { 
     ErrorInfo err = new ErrorInfo("Something went wrong when trying to query the database. See the log for details."); 
     err.WriteToErrorLog(ex); 
     return View("Error", err); 
    } 
0

를 사용하려고합니다. 예외를 잡을 수 있으려면 try 블록에서 호출해야합니다.

둘째 : 당신은 당신이 예외가 발생하면 기본 페이지를 표시 할 수 web.config 파일 인 CustomError을 활성화하고 오류 페이지

로 리디렉션 할 수 있기 때문에 보안상의 이유로의 최종 사용자에게 노란색 오류 화면을 표시해서는 안
<customErrors mode="On" defaultRedirect="~/ErrorPages/GeneralError">  
</customErrors>