2016-06-10 6 views
1

Ich versuche, einige Fehlerbehandlung, wenn es um die Verbindung zu einer MySQL-Datenbank kommt. Ich möchte Verbindungsfehler und SQL-Fehler trennen. Issue-Sein ist der Fehler, der zurückgegeben wird, scheint kein MySQL-Fehler zu sein, sondern tatsächlich ein MS-Fehler. Das ist, was ich tue:WPF MySQL-Verbindung Fehlerbehandlung

using (MySqlConnection con = new MySqlConnection(ConString)) 
{ 
    MySqlDataAdapter da = new MySqlDataAdapter(); 
    MySqlCommand cmd = new MySqlCommand(sqlCMD, con); 
    try 
    { 
     System.Security.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true; 
     var provider = new System.Security.Cryptography.RSACryptoServiceProvider(); 
     con.Open(); 
     da.SelectCommand = cmd; 
     da.Fill(dt); 
     con.Close(); 
    } 
    catch (Exception x) 
    { 
     //Amazing error catching code 
    } 
} 

Jetzt kann sagen, dass ich versuche, eine Maschine zu verbinden, die MySQL nicht installiert ist, ist dies die Ausnahme, dass zurückgegeben wird:

MySql.Data.MySqlClient .MySqlException (0x80004005): Verbindung zu keinem der angegebenen MySQL-Hosts möglich. bei MySql.Data.MySqlClient.NativeDriver.Open() bei MySql.Data.MySqlClient.Driver.Open() bei MySql.Data.MySqlClient.Driver.Create (MySqlConnectionStringBuilder Einstellungen) bei MySql.Data.MySqlClient.MySqlPool .GetPooledConnection() bei MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() bei MySql.Data.MySqlClient.MySqlPool.GetConnection() bei MySql.Data.MySqlClient.MySqlConnection.Open()

Jetzt Googling "0x80004005 MySQL" liefert mehrere Threads auf Stack Overflow über C# Verbindung mit MySQL. Nur eine Suche nach 0x80004005 returns a Windows XP error message page.

So das lässt mich mit einer Frage, was ist der beste Weg, um einen Verbindungsfehler vs eine SQL-Fehlermeldung zu ermitteln?

+1

Warum nicht durchführen Fänge auf die verschiedenen Ausnahmetypen, die MySQL-Anschluss geworfen werden. (Nicht exakte Ausnahmetypen) wie try {} catch (MySqlConnectionException) {} catch (MySqlQueryException). Sie können mehr als einen Typ von Ausnahme erfassen und behandeln, insbesondere eine allgemeine Ausnahme. Anderenfalls müssten Sie die allgemeine Ausnahme untersuchen und den zugrunde liegenden Ausnahmetyp ermitteln. Sehen Sie sich auch dieses Beispiel https: //dev.mysql an.com/doc/connector-net/de/connector-net-programming-connecting-errors.html – Bearcat9425

+0

@ Bearcat9425 schade, dass Sie dies als Kommentar und nicht eine tatsächliche Antwort beantwortet haben. Ich hätte dir den Kredit gegeben. Wie es alles ist, was ich tun kann, ist der Kommentar. Wenn Sie das nächste Mal antworten, gebe ich Ihnen die Antwort. – Xaphann

+1

Posted mein Kommentar als Antwort für einen Verweis auf jemand anderes, der auf diese Frage kommt. Ich weiß, dass Sie bereits eine Antwort markiert haben, aber ich dachte mir, dass ich meine Version der Antwort einfügen würde. – Bearcat9425

Antwort

1

Warum Führen Sie keine Fänge für die verschiedenen Ausnahmetypen durch, die der MySQL-Connector auslösen kann. (Nicht genau Exception-Typen) wie

try 
{ 
}catch(MySqlConnectionException) 
{ 
}catch(MySqlQueryException) 
{ 
} 

Sie können mehr als 1 Art von Ausnahme fangen und zu handhaben, vor allem eine allgemeine Ausnahme. Anderenfalls müssten Sie die allgemeine Ausnahme untersuchen und den zugrunde liegenden Ausnahmetyp ermitteln. Werfen Sie einen Blick auf dieses Beispiel auch

https://dev.mysql.com/doc/connector-net/en/connector-net-programming-connecting-errors.html

1

Mir sind keine MySQL-Ausnahmen bekannt, aber Sie müssen mehr catch-Blöcke verwenden.

gehen Sie einfach zur Definition der einzelnen Methoden, die Sie verwendet haben, und dort können Sie sehen, welche Ausnahmen von jeder Methode ausgelöst werden können. dann statt

catch (Exception x) 
    { 
     //Amazing error catching code 
    } 

mehrere Fangblöcke nacheinander verwenden. In diesem Beitrag erfahren Sie, wie Sie Ausnahmen gruppieren, wenn es zwei gibt.

Catch multiple exceptions at once?

1

einfach diese als einfache Idee betrachten und wenn nicht benötigt, nur ignore..There könnte offizieller Weg anders als dies sein ..

catch (MySqlException ex) 
{ 
    if (ex.Message.Contains("connection")) 
    { 
     // do stuff when connection trouble 
    } 
    else 
    { 
     // do stuff when MySql trouble 
    } 
} 

this helps ..