Verbindung zur Datenbank C # testen

  • Ich habe eine kleine Methode zum Testen der Verbindung zu einer Datenbank erstellt:

     public bool TestConnection(string provider, string serverName, string initialCatalog, string userId, string password, bool integratedSecurity)
    {
        var canConnect = false;
    
        var connectionString = integratedSecurity ? string.Format("Provider={0};Data Source={1};Initial Catalog={2};Integrated Security=SSPI;", provider, serverName, initialCatalog) 
                                                  : string.Format("Provider={0};Data Source={1};Initial Catalog={2};User ID={3};Password={4};", provider, serverName, initialCatalog, userId, password);
    
        var connection = new OleDbConnection(connectionString);
    
        try
        {
            using (connection)
            {
                connection.Open();
    
                canConnect = true;
            }
        }
        catch (Exception exception)
        {
    
        }
        finally
        {
            connection.Close();                
        }                                         
    
        return canConnect;
    }
     

    Trotz der Methode funktioniert es mir nicht richtig. Gibt es eine Möglichkeit, die Verbindung zu testen, ohne die Ausnahme abfangen zu müssen? Kann dasselbe Ergebnis auf andere Weise erzielt werden?

    10 November 2011
    Alex DugglebyPaul Stovell
3 answers
  • Es ist etwas wortreich.

    Ich würde schreiben

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

    Sie sollten auch OleDbConnectionStringBuilder verwenden, um die Variablen in der Verbindungszeichenfolge ordnungsgemäß zu schützen.

    10 November 2011
    Peter Baer
  • Ich habe vor einiger Zeit einen geschrieben, der mit SQL Server und Ihrer aktuellen Benutzeridentität funktionierte:

     namespace DatabaseConnectionTester
    {
        using System;
        using System.Data.Common;
        using System.Data.SqlClient;
    
        internal static class Program
        {
            private static int Main(string[] args)
            {
                bool result;
    
                if (args.Length == 0)
                {
                    result = true;
                }
                else
                {
                    try
                    {
                        var connectionString =
                            "Connect Timeout=10;Pooling=false;Integrated Security=sspi;server=" + args[0];
    
                        using (var connection = new SqlConnection(connectionString))
                        {
                            connection.Open();
                            result = true;
                        }
                    }
                    catch (DbException)
                    {
                        result = false;
                    }
    
                    if (args.Length > 1)
                    {
                        Console.WriteLine(result);
                    }
                }
    
                return Convert.ToInt32(result);
            }
        }
    }
     
    10 November 2011
    Jesse C. Slicer
  • Sie können es in eine TryOpenConnection-Methode umwandeln, was eher ein allgemeiner akzeptierter Grund für das Mischen von Logik und Fehlerbehandlung ist (was sonst eine schlechte Idee ist). Ich würde meinen, Sie möchten diese Verbindung tatsächlich nutzen? Sie müssen nicht nur zur Bestätigung öffnen / schließen. Ich denke auch, dass es ein bisschen wortreich ist, jeden Teil der Verbindungszeichenfolge separat zu übergeben, aber Sie erhalten den Punkt:

         public bool TryOpenConnection(string connectionString, out OleDbConnection connection)
        {
            try {     
                var conn = new OleDbConnection(connectionString); 
                conn.Open();
                connection = conn;
                return true; 
            } 
            catch (OleDbException exception) {
                connection = null; 
                return false; 
            } 
        }
     
    10 November 2011
    Sean Thoman