New: better Exception Handling
All checks were successful
Build and Push Docker Image / build (push) Successful in 7m0s

This commit is contained in:
2026-03-18 09:47:58 +01:00
parent d90a6f970f
commit 18289006d1
9 changed files with 140 additions and 68 deletions

View File

@@ -1,4 +1,9 @@
@inherits LayoutComponentBase @using Services
@inherits LayoutComponentBase
@implements IDisposable
@rendermode RenderMode.InteractiveServer
@inject IErrorService ErrorService
<div class="page"> <div class="page">
<div class="sidebar"> <div class="sidebar">
@@ -7,6 +12,13 @@
<main> <main>
<article class="content px-4"> <article class="content px-4">
@if(ErrorService.ex != null) {
<div class="alert alert-danger m-3" role="alert">
@ErrorService.ex.Message
<button type="button" class="btn-close float-end" aria-label="Close" @onclick="DismissError"></button>
</div>
}
@Body @Body
</article> </article>
</main> </main>
@@ -17,3 +29,20 @@
<a href="." class="reload">Reload</a> <a href="." class="reload">Reload</a>
<span class="dismiss">🗙</span> <span class="dismiss">🗙</span>
</div> </div>
@code {
protected override void OnInitialized()
{
ErrorService.OnChange += StateHasChanged;
}
private void DismissError()
{
ErrorService.ex = null;
}
public void Dispose()
{
ErrorService.OnChange -= StateHasChanged;
}
}

View File

@@ -0,0 +1,18 @@
@page "/ErrorTest"
@using Microsoft.Data.SqlClient
@using Services
@inject IErrorService ErrorService
<PageTitle>Error Test</PageTitle>
<h1>Error Page</h1>
<button @onclick="SetError" class="btn btn-primary">Set Error</button>
@code {
private void SetError() {
ErrorService.ex = new Exception("Hello World");
}
}

View File

@@ -1,7 +1,9 @@
@page "/" @page "/"
@using Models @using Models
@using Services @using Services
@using System.Runtime.InteropServices
@inject IRentService RentService @inject IRentService RentService
@inject IErrorService ErrorService
<PageTitle>Home</PageTitle> <PageTitle>Home</PageTitle>
@@ -45,9 +47,11 @@
protected override void OnInitialized() protected override void OnInitialized()
{ {
_vehicles = RentService.GetAvailableCars(); try {
Console.WriteLine("VC" + _vehicles.Count); _vehicles = RentService.GetAvailableCars();
@* return Task.CompletedTask; *@ } catch (Exception e) {
ErrorService.ex = e;
}
} }
} }

View File

@@ -1,8 +1,10 @@
@page "/rent" @page "/rent"
@using Models @using Models
@using Services @using Services
@using System.Runtime.InteropServices
@inject IRentService RentService @inject IRentService RentService
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
@inject IErrorService ErrorService
<PageTitle>Rent</PageTitle> <PageTitle>Rent</PageTitle>
@@ -41,15 +43,22 @@
protected override void OnInitialized() protected override void OnInitialized()
{ {
_vehicles = RentService.GetAvailableCars(); try {
_customers = RentService.GetCustomers(); _vehicles = RentService.GetAvailableCars();
_customers = RentService.GetCustomers();
} catch (Exception e) {
ErrorService.ex = e;
}
} }
private Task RentCar() private Task RentCar()
{ {
RentService.RentCar(_customerId, _vehicleId, _from, _thru); try {
Console.WriteLine("Rented Car"); RentService.RentCar(_customerId, _vehicleId, _from, _thru);
NavigationManager.NavigateTo("/"); NavigationManager.NavigateTo("/");
} catch (Exception e) {
ErrorService.ex = e;
}
return Task.CompletedTask; return Task.CompletedTask;
} }
} }

View File

@@ -2,6 +2,7 @@
@using Models @using Models
@using Services @using Services
@inject IRollbackService RollbackService @inject IRollbackService RollbackService
@inject IErrorService ErrorService
<PageTitle>Rollback</PageTitle> <PageTitle>Rollback</PageTitle>
@@ -12,7 +13,11 @@
@code { @code {
private Task PerformRollback() { private Task PerformRollback() {
RollbackService.ResetToDefaults(); try {
RollbackService.ResetToDefaults();
} catch (Exception e) {
ErrorService.ex = e;
}
return Task.CompletedTask; return Task.CompletedTask;
} }
} }

View File

@@ -17,6 +17,7 @@ public static class ServiceCollectionExtension
services.Services.AddScoped<IRentService, RentService>(); services.Services.AddScoped<IRentService, RentService>();
services.Services.AddScoped<IRollbackService, RollbackService>(); services.Services.AddScoped<IRollbackService, RollbackService>();
services.Services.AddScoped<IErrorService, ErrorService>();
return services; return services;
} }
} }

View File

@@ -0,0 +1,30 @@
using System.Data;
using Configuration;
using Microsoft.Data.SqlClient;
using Models;
namespace Services
{
public interface IErrorService
{
Exception? ex { get; set; }
event Action? OnChange;
}
public class ErrorService : IErrorService
{
private Exception? _ex;
public Exception? ex
{
get => _ex;
set
{
_ex = value;
NotifyStateChanged();
}
}
public event Action? OnChange;
private void NotifyStateChanged() => OnChange?.Invoke();
}
}

View File

@@ -17,22 +17,16 @@ namespace Services
public List<Vehicle> GetAvailableCars() public List<Vehicle> GetAvailableCars()
{ {
List<Vehicle> vehicles = new List<Vehicle>(); List<Vehicle> vehicles = new List<Vehicle>();
try
{
using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
string sql = "SELECT * FROM v_VerfuegbareFahrzeuge;";
SqlCommand cmd = new SqlCommand(sql, conn);
using SqlDataReader reader = cmd.ExecuteReader(); using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
string sql = "SELECT * FROM v_VerfuegbareFahrzeuge;";
SqlCommand cmd = new SqlCommand(sql, conn);
while (reader.Read()) using SqlDataReader reader = cmd.ExecuteReader();
{
vehicles.Add(Vehicle.FromReader(reader)); while (reader.Read())
}
}
catch (Exception e)
{ {
Console.WriteLine(e); vehicles.Add(Vehicle.FromReader(reader));
} }
return vehicles; return vehicles;
@@ -41,45 +35,34 @@ namespace Services
public List<Customer> GetCustomers() public List<Customer> GetCustomers()
{ {
List<Customer> customers = new List<Customer>(); List<Customer> customers = new List<Customer>();
try
using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
string sql = "SELECT * FROM Customer;";
SqlCommand cmd = new SqlCommand(sql, conn);
using SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{ {
using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection(); customers.Add(Customer.FromReader(reader));
string sql = "SELECT * FROM Customer;";
SqlCommand cmd = new SqlCommand(sql, conn);
using SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
customers.Add(Customer.FromReader(reader));
}
} }
catch (Exception e)
{
Console.WriteLine(e);
}
return customers; return customers;
} }
public void RentCar(long customerId, long vehicleId, DateTime start, DateTime end) public void RentCar(long customerId, long vehicleId, DateTime start, DateTime end)
{ {
try
{ using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection(); using SqlCommand cmd = new SqlCommand("sp_MieteFahrzeug", conn);
using SqlCommand cmd = new SqlCommand("sp_MieteFahrzeug", conn); cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@KundeID", customerId); cmd.Parameters.AddWithValue("@KundeID", customerId);
cmd.Parameters.AddWithValue("@FahrzeugID", vehicleId); cmd.Parameters.AddWithValue("@FahrzeugID", vehicleId);
cmd.Parameters.AddWithValue("@Start", start); cmd.Parameters.AddWithValue("@Start", start);
cmd.Parameters.AddWithValue("@Ende", end); cmd.Parameters.AddWithValue("@Ende", end);
cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();
}catch (Exception ex)
{
Console.WriteLine(ex);
}
} }
} }
} }

View File

@@ -14,24 +14,17 @@ namespace Services
{ {
public void ResetToDefaults() public void ResetToDefaults()
{ {
try using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
{
using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
string sql = @" string sql = @"
USE [master]; USE [master];
ALTER DATABASE [2025_5bhitn_konstantin_hintermayer_smarter_rentDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; ALTER DATABASE [2025_5bhitn_konstantin_hintermayer_smarter_rentDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE [2025_5bhitn_konstantin_hintermayer_smarter_rentDB] FROM DATABASE_SNAPSHOT = '2025_5bhitn_konstantin_hintermayer_smarter_rentDB_snapshot'; RESTORE DATABASE [2025_5bhitn_konstantin_hintermayer_smarter_rentDB] FROM DATABASE_SNAPSHOT = '2025_5bhitn_konstantin_hintermayer_smarter_rentDB_snapshot';
ALTER DATABASE [2025_5bhitn_konstantin_hintermayer_smarter_rentDB] SET MULTI_USER;"; ALTER DATABASE [2025_5bhitn_konstantin_hintermayer_smarter_rentDB] SET MULTI_USER;";
using SqlCommand cmd = new SqlCommand(sql, conn); using SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
} }
} }
} }