2014-02-15 2 views
1

Я пытаюсь написать метод, который будет проверять правильность подключения к базе данных. Вот код, стоящий за моей кнопкой Test Connection.Тестирование Sql Connection Validity

private void TestConn_btn_Click(object sender, EventArgs e) 
    { 
     DbConnection DBConnTest; 

     if (DataSrc_cbx.SelectedIndex == 1) 
     { 
      DBConnTest = new SqlConnection("Server="+DatabaseAddress_Value+"; Database="+DatabaseName_Value+";Trusted_Connection=true"); 
      try 
      { 
       DBConnTest.Open(); 
       MessageBox.Show("\nTEST SUCCESSFUL\n"); 
      } 
      catch (Exception exception) 
      { 
       MessageBox.Show("TEST FAILED Exception Thrown: " + exception.Message); 
      } 
      finally 
      { 
       DBConnTest.Close(); 
      } 
     } 
     } 

Проблема заключается в том, что не исключение генерируется, когда я ввожу неверный адрес базы данных (или оставьте пустым все вместе), то же самое относится и к имени базы данных. Он выдает исключение только в случае отсутствия строки подключения или в неправильном формате. Поэтому мой вопрос: как мне проверить, действительно ли на сервере есть сервер и база данных с именами?

+0

Когда я попробовал тот же блок кода на другом ПК (Win7 64bit, VS2012Ultimate), она работала должным образом, как и ожидалось. Там, где параметр неверен, генерируется исключение. Не знаю, является ли это проблемой системы. – Aelgawad

ответ

2

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

select name from sys.sysdatabases 
where dbid=db_id() 

пользователю необходимо .. SELECT, FROM идентификатор пользователя WHERE Войти = «JohnSmith» и посмотреть, если это дает вам какие-либо строки. Если да - пользователь существует.

Вы можете использовать эту обходную работу.

1

Ваш код работает на меня. Проблема здесь в том, что вам нужно подождать до истечения периода ожидания SQL до того, как будет выбрано исключение. Это не будет метод, который возвращает немедленный ответ. Если вы закроете этот try/catch с помощью WaitCursor, вы, по крайней мере, увидите, когда код работает.

private void TestConn_btn_Click(object sender, EventArgs e) 
{ 
    this.Cursor = Cursors.WaitCursor; 
    DbConnection DBConnTest; 

    if (DataSrc_cbx.SelectedIndex == 1) 
    { 
     DBConnTest = new SqlConnection("Server="+DatabaseAddress_Value+"; Database="+DatabaseName_Value+";Trusted_Connection=true"); 
     try 
     { 
      DBConnTest.Open(); 
      MessageBox.Show("\nTEST SUCCESSFUL\n"); 
     } 
     catch (Exception exception) 
     { 
      MessageBox.Show("TEST FAILED Exception Thrown: " + exception.Message); 
     } 
     finally 
     { 
      DBConnTest.Close(); 
     } 
    } 
    this.Cursor = Cursors.Default; 
    } 
+0

Он по-прежнему дает те же результаты! – Aelgawad

+0

@BlackyDucky Это сработало для меня, но потребовалось 60 секунд, чтобы выбросить исключение. Просто заметили, что вы веб-формы, я попробовал это в winforms – wruckie

+0

Я не, его настольное приложение, и где ваш код пошел ?! – Aelgawad

0

Возможно попробовать:

 using (SqlConnection conn = new SqlConnection(builder.ToString())) 
     { 
      try 
      { 
       conn.Open(); 
      } 
      catch (SqlException ex) 
      { 
       foreach (SqlError error in ex.Errors) 
       { 
        Console.WriteLine(error.Number); 
       } 
      } 
      catch (Exception ex) 
      { 

      } 
     } 

Она возвращает код ошибки DB (выполнить следующий запрос для получения списка кодов ошибок:

выберите * из sys.messages где LANGUAGE_ID = 1033 и серьезность между 11 и 16

Корпорация Майкрософт также дает некоторые рекомендации здесь:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlerror.number(v=vs.110).aspx

1

Вам необходимо выполнить запрос для подключения к базе данных.

Для SQL Server, я обычно использую IDbCommand.ExecuteScalar выполнить:

SELECT @@VERSION 

Для Oracle:

SELECT banner from v$version where banner like 'Oracle%' 

ли вы предоставить полный код, пожалуйста?

Было бы что-то вроде:

try 
{ 
    using(SqlConnection conn = ...) 
    { 
     conn.Open(); 
     using(SqlCommand command = conn.CreateCommand()) 
     { 
      command.CommandText = "SELECT @@VERSION"; 
      var result = (string) command.ExecuteScalar(); 
      MessageBox.Show("\nTEST SUCCESSFUL\n" + result); 
     } 
    } 
} 
catch(Exception ex) 
{ 
    MessageBox.Show("TEST FAILED Exception Thrown: " + exception.Message); 
} 
+0

Не могли бы вы предоставить полный код? – Aelgawad