Das ist korrekt so, der Origin ist eine Kombination aus Protokoll, DNS Name/IP und Port. Deswegen muss alles drei übereinstimmen, sonst kommt diese Fehlermeldung.
Den Namen deines Repository Interface würde ich generischer halten - warum steht das SQLite im Namen, das kann durchaus Technologie Unabhängig sein!
ObservableCollection kannst du in der GUI schicht durchaus verwenden. An einer DB macht es nur dann Sinn, wenn die DB dich über Änderungen informieren würde.
Für WPF empfiehlt sich das MVVM Entwurfsmuster ( [Artikel] MVVM und DataBinding ). Da würde dein Szenario ungefähr wie folgt aussehen:
im ViewModel werden deine 5 Textboxen durch String Properties repräsentiert. Der Enter Button wird als ICommand Implementierung getriggert und übergibt die 5 Strings an einen Service um sie dann wieder zu leeren.
Den Rest mach Datenbindung.
Du hast wohl recht mit dem Anhaften. Die Assoziation war Column Attribut und Property Attribut :)
Für die Konfiguration nehmen wir die Fluent API.
Auf die Limitierungen der Migrations bin ich selber schon gestoßen, kann aber gerade nicht das Projekt umstellen auf ein anderes Verfahren mit dem ich zusätzlich noch keinerlei Erfahrung habe. Aktuell hoffe ich einfach auf nicht zu viele Schema Änderungen.
Schade mit dem Sql() call, plain calls würde ich gerne vermeiden.. ich werd mich bei Gelegenheit mal einlesen, vielleicht gibt es ja die Möglichkeit eine Erweiterung für die Fluent API zu schreiben.
wir verwenden einige SQL Datenbanken in Azure. Seitens unserer IT wurde jetzt für den SQL Server das Auditing aktiviert, so dass ich entsprechende Infos über mögliche Datenklassifizierungen in SQL Server bekomme.
Ehrlich gesagt habe ich mir um das Thema bisher keine Gedanken gemacht, ich denke aber dass es durchaus sinnvoll ist hier die passenden Spaltenattribute zu setzen.
Wie das theoretisch und praktisch "per Hand" funktioniert habe ich mir angeschaut (aus der Doku), würde das aber gerne entweder direkt an den POCO's von efcore oder mit einer Migration machen.
In der efcore doku habe ich weder etwas passendes auf Datenklassifizierung, noch auf etwas ähnliche wie "Custom Attributes" gefunden.
Hat jemand eine Idee, wie man das (ausser über einen Sql("...")) call in der Migration erledigen könnte?
Du müsstest das Panel so definieren, dass es von der anderen Klasse aus zugegriffen werden kann.
Allerdings vermischt du dabei UI mit Logik Aufgaben. Besser wäre, du stellst von deiner Klasse aus eine Collection (z.B. ObservableCollection<T>) als Public Property zur Verfügung, auf dessen Änderung deine Form reagieren kann und das Panel neu rendert.
Die ObservableCollection<T> bietet dabei bereits Events an, die bei Änderung aufgerufen werden. Das hat den Nachteil, dass wenn du mehrere Sachen änderst, jedesmal das Panel neugeladen werden könnte. Daher wäre hier eine mögliche Lösung, eine normale Collection zu verwenden und ein eigenes Event zu definieren.
das hat etwas mit dem Unterschied von Referenz- und Werttypen zu tun. Für Werttypen, wie string einer ist, ist es einfach nicht vorgesehen soetwas zu machen.
Die einfachste Möglichkeit genau das zu erreichen, was du dort vorhast, ist mit einer Model Klasse zu arbeiten:
class ZeichenkettenModel
{
public string Zeichenkette { get; set; }
}
ZeichenkettenModel test = new ZeichenkettenModel();
test.Zeichenkette = "Hallo";
// Aufruf
new Testfenster(test);
Damit hast du eine Referenz, mit der du arbeiten kannst. Solltest du die Klasse dann noch einmal erweitern musst du nicht nicht einmal groß etwas erfinden um das zu tun - was bei der Übergabe von einem String allerdings notwendig wäre.
du hast Recht, hier habe ich allerdings vorgesorgt. Der Service besteht aus zwei Services mit dem gleichen Interface, die sich gegenseitig aufrufen können. Der "vordere" fungiert dabei als Cache Proxy. Dieser hält die Informationen kurzzeitig vor, gerade weil ich Bursts dieser Anfragen erwarte und nicht auf die DB warten möchte.
Mir bleibt also die Wahl:
-> Frage alle Details der passenden Kategorie ab (fragt wesentlich mehr Daten als benötigt ab)
-> Frage explizit für die eingehenden Id's die "Id2" ab (im Bulk)
-> Frage async im Select ab
Architektonisch gefällt mir Option 1 am besten, ähnliche Abfragen habe ich schon, würde also der Linie treu bleiben.
Hmm, also den Service synchron programmieren oder mittels GetAwaiter().GetResult() ?
Ich wollte eigentlich gerne vermeiden synchrone Methoden in dem IO Belasteten Service anzubieten. Aktuell hängt da ein DB Call (ggf. mit Cache) dahinter, perspektivisch soll da ein HTTP Call zu einer API hinterhängen.
Würdest du den den Service so abändern, IEnumerable anstatt einer Id entgegennimmt und dann eine IDictionary zurückgibt, dass ich im Mapping verwenden kann?
ich möchte gerne ein Objekt um weitere Informationen anreichern. Dafür verwendet ich ein Mapping mittels LINQ:
var t = item.Select(async x => new { x.Id, x.Value, Id2 = await service.GetAsync(x.id) });
Mein Problem gerade: Von welchem Typ ist t? --> t ist IEnumerable<Task<anonymous>>
Das ist etwas unpraktisch, denn wenn ich an die Datenobjekte herankommen möchte müsste ich
var result = Task.WhenAll(t);
machen.
Gibt es da nicht eine elegantere Lösung? SelectAsync() wäre schön :D.
Auf Stackoverflow gibt es noch Vorschläge mit der .Result Property, das würde ich gerne vermeiden.
wenn du den Wert bereits als double hast, kannst du ihn einfach teilen. Das was du da hast ist ein Fix-Komma-Wert, also ein Wert der an einer bestimmten Stelle ein Komma hat, das aber nur per Definition dort ist:
1159.0 / 100 = 11.59
Was du auf jeden Fall beachten solltest ist, dass du ggf. einmal andere Werte als die erwartenden Zahlen in deinen Algorithmus bekommst, das solltest du abfangen (Was z.B., wenn dir jemand keine Zahlen sondern Buchstaben gibt).
Dafür bietet sich die Methode double.TryParse an.
P.S.: Wenn du die Wahl hast, ich würde keine Daten in die Nummern hineinkodieren, sondern diese separat in einer Datenbank pflegen. Spätestens, wenn sich mal etwas ändert musst du dann dein System nicht anpassen und weitere Parser erstellen.
Das liegt daran, dass "?=a" ein Array von Arrays mit unterschiedlichen Typen ist, du aber ein Array of SystemSeed daraus machen willst.
Entweder, du gehst da in mehreren Schritten heran (z.B. erst in ein Array deserialisieren und dann in ein Objekt verwandeln) oder schaust dir die JsonConverter von JSON.NET an.
Vor allem bei länger laufenden Operationen (=> Datei einlesen, verarbeiten, speichern), bietet sich Nebenläufigkeit, also async an: [FAQ] Warum blockiert mein GUI?
die Fehlermeldung sagt, dass du versucht einer Variable eines bestimmten Typs einen anderen, nicht kompatiblen zuzuweisen (Das ist wie Äpfel und Birnen vergleichen). Das sind Grundlagen.
Vielleicht hilft dir das weiter: [FAQ] Wie finde ich den Einstieg in C#?
Eine Collection ist dabei immer die Mehrzahl von dem eigentlichen Typ, deine Variable erwartet allerdings genau ein Control, nicht eine ControlCollection.
so können wir dir fast nicht helfen.
-> Was funktioniert denn nicht?
-> Hast du mal mit dem Debugger ( [Artikel] Debugger: Wie verwende ich den von Visual Studio? ) geschaut, wie sich deine Zugriff auflösen, was die Objekte z.B. beim Aufruf von Controls["..."] zurückgibt?
ich kenne mich mit WinForms nicht gut aus (in das Forum hätte es wohl auch besser gepasst), würde aber an deiner Stelle mal folgendes machen: Schau im Debugger, was für Möglichkeiten die dein SelectedItem bietet.
==> [Artikel] Debugger: Wie verwende ich den von Visual Studio?
Edit: Sorry, auf dem Schlauch gestanden... DataRowView ist eine View einer Zeile.. da müsstest du eigentlich mit ((DataRowView)SelectecItem)["Spalte"] an den Wert kommen.
P.S. das was du da baust ist eine riesige Sicherheitslücke, zum einen weil der Nutzer direkten Datenbankzugriff hat (ohne, dass du kontrollieren kannst, was er macht) und weil du die Tür für SQL Injection ganz weit aufmachst. Querys baut man nicht mit String Concat zusammen, sondern mit SQL Parametern.
Das TabControl wäre das richtige für den Anwendungsfall. Jedes Tab hat einen Header (ggf. mit eigenem Template) und jeweils einen Inhalt der dargestellt wird, wenn der Tab ausgewählt ist.
Tip: fange gleich mit an Sicherheit in deinem Konzept zu berücksichtigen. Später geht es vielleicht nicht mehr so gut und man lässt es dann weg.
Ich sehe an deinem Code nichts, wo du versuchst die POST Daten auszuwerten. Das wird vermutlich das Problem sein.
Du würdest es dir einfacher machen, wenn du anstatt des HttpListeners eine fertige Lösung nimmst, z.B. ASP.NET Core mit Kestrel oder NancyFx.
Du solltest dabei aber immer bedenken, dass privilegierte Ports (ich meine das ist alles unter 10k) nicht durch jeden Benutzer geöffnet werden kann. Wenn es doch HtppListener sein soll bietet Windows da eine Möglichkeit das unter Port 80 zu machen, mittels "Temporary Listen Addresses":
Um meine Fragen noch einmal zu konkretisieren:
-> Hast du Indizes auf den Datumsspalten in der MySQL
-> Wie lange dauert genau eine solche Anfrage, wenn du sie nicht über dein Programm, sondern über z.B. PHPMyAdmin laufen lässt (lokal auf dem Server)
-> Hast du einmal Zeiten gemessen? (Query Laufzeit direkt auf dem Server, vs. Laufzeit in deinem Programm)
Wenn du nur wissen willst, ob ein Tisch frei ist würde sich vielleicht eine COUNT() Abfrage anbieten, die die Reservierungen zählt, die in einem bestimmten Zeitbereich für einen Tisch liegen, allerdings auch hier wieder der Punkt -> Hast du Indizes auf den Datumsspalten?
hast du denn einmal geprüft, woran es wirklich liegt?
Benötigt die Selektion in MySQL so lange oder liegt es am Transportweg?
Wenn es am Transportweg liegt (was ich mir fast nicht vorstellen kann, ausser du hast eine echt langsame Internetanbindung) dann könnte die SQLite helfen.
Liegt es an der Abfrage wird es vermutlich nur langsamer werden durch die SQLite (vorausgesetzt, der DB Server liegt nicht unter zuviel Last).
Was dir da helfen könnte wäre ein passenderes DB Layout (evtl. fehlen ja auch nur Indizes??) in der MySQL.
Bitte beachte, dass aus Sicherheitsgründen ein lokaler Client nicht direkt mit der DB kommunizieren sollte, sondern soetwas wie eine HTTP Api dazwischen liegen sollte.
Ausserdem solltest du unter keinen Umständen SQL Abfragen per String-Verkettung erstellen, sondern mit Parametern arbeiten: [Artikelserie] SQL: Parameter von Befehlen
Auch würde ich an deiner Stelle mit Klammerungen arbeiten, damit du genau bestimmen kannst, welche deiner WHERE Bedingungen wie verknüpft werden. Um deinen Query zu verstehen müsste ich jetzt nachschlagen, was höher priorisiert ist (AND oder OR), mit Klammern wird es lesbarer.
Wenn du unbedingt mit Reflection arbeiten willst, dann kannst du die Properties doch einfach sortieren, bevor du den Json String zusammenbaust (Abgesehen davon, dass strings mit += zusammensetzen gerade in schleifen problematisch ist).
Das DateTime Struct ist nach der Initialisierung mit einem Wert nicht mehr beschreibbar.
D.h., wenn du die Zeit oder das Datum verändern willst, muss du ein neues DateTime Objekt erstellen.
Das kannst du über zwei Wege:
-> Über die Add*() Methoden (z.B. AddHours())
-> Durch addieren eines TimeSpan Objektes
Dabei musst du beachten, dass ein DateTime Objekt immer beides enthält: Datum und Zeit, willst du eine Uhrzeit auf ein bereits bestehendes DateTime Objekt festlegen, kannst du die Property Date des Nutzen.
z.B. so:
DateTime termin = DateTime.Now;
DateTime zeit = DateTime.Now.AddHours(1.0);
DateTime terminUndZeit = termin.Date.AddHours(zeit.Hour).AddMinutes(zeit.Minutes).AddSeconds(zeit.Seconds);
Ist dein Problem, dass beim auslösen des SerialPort.DataReceived Events noch nicht alle Daten, die du benötigst im Buffer liegen?
Wenn dem so ist, dann musst du dir einfach das zwischenergebnis merken und die Auswertung erst dann starten, wenn alles da ist. --> Das wäre durch eine eigene Klasse zum Handling mit dem SerialPort einfacher gelöst.
Merke: Ein DataReceived Event könnte auch zwei unterschiedliche Informationen vom µC enthalten.
Da du aber nicht genau sagst, was der Fehler oder das Fehlverhalten ist können wir nur ein wenig reinstochern...
Interessant wäre:
-> Was kommt an?
-> Was sollte ankommen?