2015-01-22 4 views
0

오늘 내가 실패한 쿼리가있는 문제를 발견했습니다. db.Database.SqlQuery<T>()을 사용하여 다른 응용 프로그램 데이터를 쿼리하고 있습니다. 우리는 그들의 데이터에 대한 사용자 정의보기를 가지고 있습니다. 오늘 관리자는 소프트웨어에서 색인을 다시 작성하고 프로세스에서 사용자 정의보기를 삭제했습니다. 그것이 SO가 해결할 수없는 문제이지만, 당신이 도울 수있는 문제는 뷰가 더 이상 존재하지 않는 경우를 정상적으로 처리하는 것입니다.db.Database.SqlQuery로 오류 처리

주 응용 프로그램의 경우이 데이터를 보완 데이터로 사용합니다. 서버 또는 테이블에 도달 할 수없는 경우 정보를 표시하는 것이 중요하지 않음을 의미합니다. 쿼리는 다음과의 WebApi의 행동에 실행 (. 나는 동안 디버깅 내 관찰에 따라 몇 가지 의견을 추가) :

public Task<HttpResponseMessage> GetByAddress(string id) 
    { 
     Task<HttpResponseMessage> response; 

     string sql = // my sql statement; 
     List<object> parameterList = new List<object>(); 
     parameterList.Add(id.ToUpper()); 
     object[] param = parameterList.ToArray(); 

     // This is worthless since the following line will completely replace this 
     IEnumerable<CallsForService> calls = new List<CallsForService>(); 
     // If the table does not exist, this does not throw an error, instead it creates a different object with the error details. 
     calls = db.Database.SqlQuery<CallsForService>(sql, param); 

     response = Task.FromResult<HttpResponseMessage>(Request.CreateResponse(HttpStatusCode.OK, calls)); 
     return response; 
    } 

내 질문에 내가 이러한 오류를 확인하고 적어도 정상적으로 다시 보내 어떻게 다음이다 응용 프로그램 호출 빈 목록. 그런 다음 ELMAH로 이러한 오류를 기록하여 문제를 파악하고 해결할 수 있습니다.

+0

try ... catch ... 블록에서 이것을 랩핑하고 catch 블록에서 빈 결과를 리턴 할 수 있습니까? –

답변

0

결과가 열거 될 때까지 쿼리가 실행되지 않으므로 반환되는 레코드 수를 계산하여 오류가있는 경우 쿼리를 수행 할 수 있습니다.

calls = db.Database.SqlQuery<CallsForService>(sql, param); 
var recCount = calls.Count(); 

마지막 줄 이후 발생한 모든 오류는 try/catch 블록에 의해 캐치됩니다.