2017-02-03 17 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. Если он провалился 5 раз, скорее всего, он не сработает. Поэтому просто создайте 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

К сожалению, если вы пишете в той же базе данных, что вы не имеете доступа к I Боюсь, вы не сможете этого сделать.

Я предлагаю вам использовать что-то вроде Log4net, которое может иметь несколько приложений (eventlog, database, file и т. Д.). Кроме того, log4net управляет чем-то вроде огня и забывает. Даже если log4net имеет какие-либо проблемы с протоколированием ошибок, он не будет генерировать исключения.