2017-02-03 9 views
0

연결을 열고 데이터를 데이터베이스에 삽입하는 try \ catch 블록이 있습니다.SQL 오류 코드 배열 처리 방법

catch (SqlException ex) 
      { 
       string sqlError = null; 
       for (int i = 0; i < ex.Errors.Count; i++) 
       { 
        sqlError += "Error Message " + ex.Errors[i].Message + "\n" + "Stored Procedure " + ex.Errors[i].Procedure + " \n " + "Line Number " + ex.Errors[i].LineNumber; 
       } 
       LogTools.WriteLog("Sql Server error " + sqlError); 
       Variables.InstallStatusDetail = "Database connection failed"; 

       if (!sqlError.Contains("connection to SQL Server")) 
       { 
        if (Variables.WriteToDatabase) 
        { HostedDataBase.InsertRunStatusIntoInstallStatus('E', sqlError, null); } 
       } 
      } 

데이터베이스에 연결 및 로깅을 방해하지 않는 sqlexceptions를 데이터베이스에 기록하려고합니다. 문제는 데이터베이스를 찾을 수 없거나 로그인에 적절한 권한이없는 경우 발생합니다. 예외가 발생하고 데이터베이스에 로그하려고하므로 데이터베이스에 기록하려고하는 함수가 호출됩니다. 데이터베이스에 다시 액세스하려고 시도하지만 다시 한 번 동일한 예외가 발생하여 DSN을 찾을 수 없거나 사용자에게 적절한 권한이 없기 때문에 데이터베이스에 쓸 수없는 시도가 반복됩니다.

데이터베이스에 액세스하고 데이터베이스에 쓸 수 없도록하는 SQL 오류를 처리하는 동시에이 루프를 발생시키지 않는 SQL 오류를 작성할 수 있습니까?

답변

0

질문에 약간 혼란 스럽지만 답변을 시도합니다. 예외 처리 방법에주의해야합니다. 예외가 처음 발생하더라도 데이터베이스에 다시 연결하려고하면 어떤 종류의 예외가 발생했는지 확인하기위한 조건이 필요할 수 있습니다. 이런 식으로 반복해서 반복되지 않는 예외 인 경우에만 다시 연결을 시도한다는 것을 알 수 있습니다.

IE.

catch (SqlException ex) 
       { 
         Error = ex.ToString() 
         WriteToLog(Error); 
         CheckError(); 

       } 

    Void CheckError() 
    { 
    //conditions based on error output. 
    } 

void WriteToLog(string Error) 
{ 
// write your error output to log 
} 
+0

막연한 질문에 사과드립니다. 모든 오류 (일부 SQL 오류 포함)를 데이터베이스에 기록하려고합니다. 문제는 프로그램에서 dsn을 찾을 수 없거나 권한이 없기 때문에 예외가 발생한 경우입니다. 코드가 다시 자신을 실행하고 찾을 수 없거나 적절한 사용 권한이없는 대상에 루프 삽입 시도가 발생합니다. 오류를 삽입하기 전에 SQL 연결 오류 (예 : 잘못된 연결 또는 부적절한 사용 권한을 가진 사용자)에 영향을주지 않는 데이터베이스 오류를 확인하는 실용적인 방법이 필요합니다. – Mattaceten

+0

가장 좋은 방법은 연결 시도를 추적하고 루프가 끊어지는 일종의 카운터를 만드는 것입니다. 5 번 실패하면 기회가 없을 것입니다. 따라서 INT를 생성하고 각 연결 시도에서 INT를 증가 시키십시오. –

+0

당신의 예제는 의미가 있지만 CheckError 메서드에서 SQL 오류가 잘못된 연결인지 나쁜 사용 권한인지를 알 수있는 방법이 있습니까? 또는 데이터베이스 액세스를 방해 할 수있는 알 수없는 오류의 전체 목록? 분명히 데이터베이스에 액세스 할 수 없다면 아무 것도 삽입하지 말아야합니다. – Mattaceten

0

이 같은, 그 자체가 된 try..catch 블록에서 로깅을 넣어해야합니다

catch (SqlException ex) 
{ 
    string sqlError = null; 
    for (int i = 0; i < ex.Errors.Count; i++) 
    { 
     sqlError += "Error Message " + ex.Errors[i].Message + "\n" + "Stored Procedure " + ex.Errors[i].Procedure + " \n " + "Line Number " + ex.Errors[i].LineNumber; 
    } 
    LogTools.WriteLog("Sql Server error " + sqlError); 
    Variables.InstallStatusDetail = "Database connection failed"; 

    if (!sqlError.Contains("connection to SQL Server")) 
    { 
     if (Variables.WriteToDatabase) 
     { 
      try { 
       //I am assuming this is where you are trying to write the error back into the database 
       HostedDataBase.InsertRunStatusIntoInstallStatus('E', sqlError, null); 
      } catch { 
       //ignore errors here 
      } 
     } 
    } 
} 
0

을 불행하게도 당신이 액세스 할 수없는 동일한 데이터베이스에 작성하는 경우, 나는 네가 그렇게 할 수 없다는 게 두렵다.

Log4net과 같이 여러 개의 appender (eventlog, database, file 등)를 사용할 수 있습니다. 또한 log4net은 불과 같은 기능을 수행합니다. log4net이 오류를 로깅하는 데 문제가 있더라도 예외를 throw하지는 않습니다.