ZKuP/ZKuP/MySqlConnectionChecker.cs
Marcus 71952c9f11 Offline detection and acting refactored
Resolved Bug with CardReader only working once
Resolved Bug with Message "Card does not exist", even if it exists
2025-09-19 10:33:07 +02:00

103 lines
3.7 KiB
C#

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Threading;
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; }
}
public static async Task<ConnectionResult> CheckConnectionAsync()
{
var result = new ConnectionResult();
var startTime = DateTime.Now;
using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)))
{
try
{
using (var connection = new MySqlConnection(SQL.GetConnstr(true, 1)))
{
await connection.OpenAsync(cts.Token);
using (var command = new MySqlCommand("SELECT 1", connection))
{
var testResult = await command.ExecuteScalarAsync(cts.Token);
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 (OperationCanceledException) when (cts.Token.IsCancellationRequested)
{
result.IsConnected = false;
result.Message = "Verbindungstest nach 1 Sekunde abgebrochen (Timeout)";
}
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}";
}
}
}
}