QueryWindow: Allow users to export query result to csv file
All checks were successful
Test / Run tests (push) Successful in 1m47s
All checks were successful
Test / Run tests (push) Successful in 1m47s
This commit is contained in:
@@ -1,7 +1,10 @@
|
||||
using Elwig.Helpers;
|
||||
using Elwig.Helpers.Export;
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
@@ -13,7 +16,12 @@ namespace Elwig.Windows {
|
||||
|
||||
private ICommand? _enterCommand;
|
||||
public ICommand EnterCommand => _enterCommand ??= new ActionCommand(async () => {
|
||||
await ExecuteQuery();
|
||||
await DisplayQuery();
|
||||
});
|
||||
|
||||
private ICommand? _saveCommand;
|
||||
public ICommand SaveCommand => _saveCommand ??= new ActionCommand(async () => {
|
||||
await SaveQuery();
|
||||
});
|
||||
|
||||
|
||||
@@ -22,33 +30,45 @@ namespace Elwig.Windows {
|
||||
}
|
||||
|
||||
private async void QueryButton_Click(object sender, RoutedEventArgs evt) {
|
||||
await ExecuteQuery();
|
||||
await DisplayQuery();
|
||||
}
|
||||
|
||||
private async Task ExecuteQuery() {
|
||||
private async void SaveButton_Click(object sender, RoutedEventArgs evt) {
|
||||
await SaveQuery();
|
||||
}
|
||||
|
||||
private async Task DisplayQuery() {
|
||||
try {
|
||||
await ExecuteQuery(QueryInput.Text);
|
||||
Mouse.OverrideCursor = Cursors.Wait;
|
||||
await DisplayQuery(QueryInput.Text);
|
||||
Mouse.OverrideCursor = null;
|
||||
} catch (Exception e) {
|
||||
Mouse.OverrideCursor = null;
|
||||
MessageBox.Show(e.Message, "Fehler beim Ausführen", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ExecuteQuery(string sqlQuery) {
|
||||
private async Task SaveQuery() {
|
||||
await SaveQuery(QueryInput.Text);
|
||||
}
|
||||
|
||||
private static async Task<(IList<DbColumn>, IEnumerable<object[]>)> ExecuteQuery(string sqlQuery) {
|
||||
var rows = new List<object[]>();
|
||||
IList<DbColumn> header;
|
||||
|
||||
using (var cnx = await AppDbContext.ConnectAsync()) {
|
||||
using var cmd = cnx.CreateCommand();
|
||||
cmd.CommandText = sqlQuery;
|
||||
using var reader = await cmd.ExecuteReaderAsync();
|
||||
header = await reader.GetColumnSchemaAsync();
|
||||
while (await reader.ReadAsync()) {
|
||||
var values = new object[reader.FieldCount];
|
||||
reader.GetValues(values);
|
||||
rows.Add(values);
|
||||
}
|
||||
using var cnx = await AppDbContext.ConnectAsync();
|
||||
using var cmd = cnx.CreateCommand();
|
||||
cmd.CommandText = sqlQuery;
|
||||
using var reader = await cmd.ExecuteReaderAsync();
|
||||
var header = await reader.GetColumnSchemaAsync();
|
||||
while (await reader.ReadAsync()) {
|
||||
var values = new object[reader.FieldCount];
|
||||
reader.GetValues(values);
|
||||
rows.Add(values);
|
||||
}
|
||||
return (header, rows);
|
||||
}
|
||||
|
||||
private async Task DisplayQuery(string sqlQuery) {
|
||||
var (header, rows) = await ExecuteQuery(sqlQuery);
|
||||
var styleRight = new Style();
|
||||
styleRight.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));
|
||||
|
||||
@@ -63,5 +83,27 @@ namespace Elwig.Windows {
|
||||
}
|
||||
DataList.ItemsSource = rows;
|
||||
}
|
||||
|
||||
private static async Task SaveQuery(string sqlQuery) {
|
||||
var d = new SaveFileDialog() {
|
||||
FileName = $"Abfrage.csv",
|
||||
DefaultExt = "csv",
|
||||
Filter = "CSV-Datei (*.csv)|*.csv",
|
||||
Title = $"Datenbank Abfrage speichern unter - Elwig"
|
||||
};
|
||||
if (d.ShowDialog() == true) {
|
||||
Mouse.OverrideCursor = Cursors.Wait;
|
||||
await Task.Run(async () => {
|
||||
try {
|
||||
var (header, rows) = await ExecuteQuery(sqlQuery);
|
||||
using var csv = new CsvSimple(d.FileName, ';', Utils.UTF8BOM);
|
||||
await csv.ExportAsync(rows.Prepend([.. header.Select(h => h.ColumnName)]));
|
||||
} catch (Exception exc) {
|
||||
MessageBox.Show(exc.Message, "Fehler beim Ausführen", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
});
|
||||
Mouse.OverrideCursor = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user