Wie überprüfe ich, ob die Verbindungszeichenfolge gültig ist?

78

Ich schreibe eine Anwendung, in der ein Benutzer eine Verbindungszeichenfolge manuell bereitstellt, und ich frage mich, ob ich die Verbindungszeichenfolge auf irgendeine Weise überprüfen kann. Ich meine, prüfen Sie, ob sie korrekt ist und ob die Datenbank vorhanden ist.

Agnieszka
quelle

Antworten:

150

Sie könnten versuchen, eine Verbindung herzustellen? Verwenden DbConnectionStringBuilderSie für eine schnelle (Offline-) Validierung möglicherweise ...

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

Um zu überprüfen, ob die Datenbank vorhanden ist, müssen Sie versuchen, eine Verbindung herzustellen. Am einfachsten, wenn Sie den Anbieter kennen:

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

Wenn Sie den Anbieter nur als Zeichenfolge kennen (zur Laufzeit), verwenden Sie DbProviderFactories:

    string provider = "System.Data.SqlClient"; // for example
    DbProviderFactory factory = DbProviderFactories.GetFactory(provider);
    using(DbConnection conn = factory.CreateConnection()) {
        conn.ConnectionString = cs;
        conn.Open();
    }
Marc Gravell
quelle
1
Wenn System.data.sqlite verwendet wird, funktioniert dieses Snippet nicht. Bis dbcon keine Abfrage ausführt, weiß der Benutzer nicht, ob die Verbindungszeichenfolge korrekt ist.
Dlopezgonzalez
@videador meinst du "ungültige Syntax"? Oder "gültige Syntax aber falsche Infos?" - Wenn es vernünftig aussieht, aber der Servername oder das Passwort falsch sind, müssen Sie versuchen, eine Verbindung herzustellen, um dies zu überprüfen. Wenn SQLite "Open ()" mit einer ungültigen Zeichenfolge wird, dann klingt das wie ein Fehler in SQLite
Marc Gravell
@MarcGravell Ich habe gehört, dass Sie keine Ausnahmen für die Flusskontrolle verwenden sollten. Gibt es eine Möglichkeit, dies zu tun, ohne eine Ausnahme zu werfen und zu fangen? Oder ist dies die beste verfügbare Methode? Vielleicht eine "Ausnahme" von der obigen Regel :)
bernie2436
1
@MarcGravell - mein Kommentar basierte auf den Dokumenten, die sagtenIf the SqlConnection goes out of scope, it is not closed. Therefore, you must explicitly close the connection by calling Close.
Geoff
3
@MarcGravell - Ich sollte härter suchen, bevor ich kommentiere :) Ich sehe, dass Dispose()AnrufeClose()
Geoff
16

Versuche dies.

    try 
    {
        using(var connection = new OleDbConnection(connectionString)) {
        connection.Open();
        return true;
        }
    } 
    catch {
    return false;
    }
Rashad Valliyengal
quelle
Ich habe Ihren Code ausprobiert. Er funktioniert wie erwartet, wird jedoch nach Ablauf des Verbindungszeitlimits ausgelöst. Ich habe versucht, das Verbindungszeitlimit in der Verbindungszeichenfolge auf 1 Sekunde festzulegen. Es hat sich nichts geändert. Gibt es eine Lösung dafür?
Alican Uzun
6

Wenn das Ziel Gültigkeit und nicht Existenz ist, reicht Folgendes aus:

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

Verwenden Sie für SQLite Folgendes: Angenommen, Sie haben eine Verbindungszeichenfolge im Textfeld 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

Ich denke, Sie können es leicht in C # -Code konvertieren

GGSoft
quelle