Як перевірити, чи правильний рядок з'єднання?


79

Я пишу програму, де користувач надає рядок підключення вручну, і мені цікаво, чи є спосіб, яким я можу перевірити рядок підключення - я маю на увазі перевірити, чи це правильно, і чи існує база даних.

Відповіді:


151

Можна спробувати підключитися? Для швидкої (автономної) перевірки, можливо, використовуйте DbConnectionStringBuilderдля її аналізу ...

    DbConnectionStringBuilder csb = new DbConnectionStringBuilder();
    csb.ConnectionString = "rubb ish"; // throws

Але щоб перевірити, чи існує db, потрібно спробувати підключитися. Найпростіше, якщо ви знаєте постачальника послуг, звичайно:

    using(SqlConnection conn = new SqlConnection(cs)) {
        conn.Open(); // throws if invalid
    }

Якщо ви знаєте постачальника лише як рядок (під час виконання), тоді використовуйте DbProviderFactories:

    string provider = "System.Data.SqlClient"; // for example
    DbProviderFactory factory = DbProviderFactories.GetFactory(provider);
    using(DbConnection conn = factory.CreateConnection()) {
        conn.ConnectionString = cs;
        conn.Open();
    }

1
Коли він використовує System.data.sqlite, цей фрагмент не працює. Поки dbcon не виконує запит, користувач не знає, чи правильний рядок з'єднання.
dlopezgonzalez

@videador Ви маєте на увазі "неприпустимий синтаксис"? Або "дійсний синтаксис, але неправильна інформація?" - очевидно, якщо це здається розумним, але ім'я або пароль сервера неправильні, вам потрібно спробувати підключитися, щоб перевірити це. Якщо sqlite буде "Відкривати ()" з недійсним рядком, то це звучить як помилка в SQLite
Марк Гравелл

@MarcGravell Я чув, що ви не повинні використовувати винятки для контролю потоку. Чи є спосіб зробити це, не кидаючи і не вловлюючи виняток? Або це найкращий із доступних методів? Можливо, "виняток" із правила вище :)
bernie2436

1
@MarcGravell - мій коментар був заснований на документах кажутьIf the SqlConnection goes out of scope, it is not closed. Therefore, you must explicitly close the connection by calling Close.
Geoff

3
@MarcGravell - мені слід посильніше шукати, перш ніж коментувати :) Я бачу, що Dispose()дзвінкиClose()
Джефф,

16

Спробуйте це.

    try 
    {
        using(var connection = new OleDbConnection(connectionString)) {
        connection.Open();
        return true;
        }
    } 
    catch {
    return false;
    }

Я спробував ваш код, він працює, як очікувалося, але він видає після закінчення часу очікування підключення. Я спробував встановити час очікування з'єднання на 1 сек у рядку з'єднання, нічого не змінилося. Чи є рішення цього?
Алікан Узун

6

Якщо метою є дійсність, а не існування, наступне зробить свою справу:

try
{
    var conn = new SqlConnection(TxtConnection.Text);
}
catch (Exception)
{
    return false;
}
return true;

0

Для sqlite використовуйте це: Припустимо, у вас є рядок підключення в текстовому полі txtConnSqlite

     Using conn As New System.Data.SQLite.SQLiteConnection(txtConnSqlite.Text)
            Dim FirstIndex As Int32 = txtConnSqlite.Text.IndexOf("Data Source=")
            If FirstIndex = -1 Then MsgBox("ConnectionString is incorrect", MsgBoxStyle.Exclamation, "Sqlite") : Exit Sub
            Dim SecondIndex As Int32 = txtConnSqlite.Text.IndexOf("Version=")
            If SecondIndex = -1 Then MsgBox("ConnectionString is incorrect", MsgBoxStyle.Exclamation, "Sqlite") : Exit Sub
            Dim FilePath As String = txtConnSqlite.Text.Substring(FirstIndex + 12, SecondIndex - FirstIndex - 13)
            If Not IO.File.Exists(FilePath) Then MsgBox("Database file not found", MsgBoxStyle.Exclamation, "Sqlite") : Exit Sub
            Try
                conn.Open()
                Dim cmd As New System.Data.SQLite.SQLiteCommand("SELECT * FROM sqlite_master WHERE type='table';", conn)
                Dim reader As System.Data.SQLite.SQLiteDataReader
                cmd.ExecuteReader()
                MsgBox("Success", MsgBoxStyle.Information, "Sqlite")
            Catch ex As Exception
                MsgBox("Connection fail", MsgBoxStyle.Exclamation, "Sqlite")
            End Try
          End Using

Я думаю, ви можете легко перетворити його в код c #

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.