ZKuP/ZKuP/MySqlConnectionChecker.cs
2025-07-28 08:20:11 +02:00

103 lines
3.6 KiB
C#

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ZKuP
{
internal class MySqlConnectionChecker
{
public class ConnectionResult
{
public bool IsConnected { get; set; }
public string Message { get; set; }
public TimeSpan ResponseTime { get; set; }
public Exception Exception { get; set; }
}
/// <summary>
/// Überprüft die Verbindung zu einem MySQL Server asynchron
/// </summary>
/// <param name="connectionString">MySQL Connection String</param>
/// <param name="timeoutSeconds">Timeout in Sekunden (Standard: 10)</param>
/// <returns>Task mit ConnectionResult</returns>
public static async Task<ConnectionResult> CheckConnectionAsync()
{
var result = new ConnectionResult();
var startTime = DateTime.Now;
try
{
using (var connection = new MySqlConnection(SQL.GetConnstr(true)))
{
await connection.OpenAsync();
// Teste mit einer einfachen Abfrage
using (var command = new MySqlCommand("SELECT 1", connection))
{
var testResult = await command.ExecuteScalarAsync();
if (testResult != null && testResult.ToString() == "1")
{
result.IsConnected = true;
result.Message = "Verbindung erfolgreich hergestellt";
}
else
{
result.IsConnected = false;
result.Message = "Verbindung hergestellt, aber Testabfrage fehlgeschlagen";
}
}
}
}
catch (MySqlException ex)
{
result.IsConnected = false;
result.Exception = ex;
result.Message = GetMySqlErrorMessage(ex);
}
catch (Exception ex)
{
result.IsConnected = false;
result.Exception = ex;
result.Message = $"Unerwarteter Fehler: {ex.Message}";
}
result.ResponseTime = DateTime.Now - startTime;
return result;
}
/// <summary>
/// Gibt eine benutzerfreundliche Fehlermeldung basierend auf MySQL-Fehlercodes zurück
/// </summary>
private static string GetMySqlErrorMessage(MySqlException ex)
{
switch (ex.Number)
{
case 0:
return "Verbindung zum MySQL-Server konnte nicht hergestellt werden. Überprüfen Sie die Serveradresse.";
case 1042:
return "MySQL-Server ist nicht erreichbar. Überprüfen Sie die Netzwerkverbindung.";
case 1045:
return "Zugriff verweigert. Überprüfen Sie Benutzername und Passwort.";
case 1049:
return "Die angegebene Datenbank existiert nicht.";
case 1130:
return "Host ist nicht berechtigt, sich mit dem MySQL-Server zu verbinden.";
case 2003:
return "MySQL-Server ist nicht erreichbar oder läuft nicht.";
default:
return $"MySQL-Fehler ({ex.Number}): {ex.Message}";
}
}
}
}