Wie rufst du DownloadString denn auf?
Wenn du das korrekt mit await machst, sollte das deine UI nicht blockieren.
Du solltest den SDK installieren, den du, für das was du vorhast benötigst.
Du kannst auch prinzipiell beide installieren.
Hi Elmo,
das ist ein "relativ neues" Feature in C#: nullable types.
In Kurzform, sofern dieses Feature aktiv ist, zeigt dir der Compiler fehler an, wenn du auf eine Methode oder eine Eigenschaft eines Objektes zugreifst, welches möglicherweise null ist.
Eine Prüfung auf null schafft Abhilfe.
P.S.: Als Empfehlung, die englischen Fehlermeldungen kann man einfach googlen.
Schau dir mal im Debugger an, was cmd.ExecuteNonQuery() zurückgibt. Vermutlich nicht dass, was du erwartest: https://learn.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.executenonquery?view=dotnet-plat-ext-7.0
P.S.: Der Code kompiliert nicht.. toString() ist kein valides C#.
Oh, du hast Recht - ich habe mich da verlesen. Ich hatte interpretiert, dass die Eigenschaften der Klasse und das enum auf derselben Ebene liegen und nicht als Body Property..
Es gibt einige Möglichkeiten, wie du vorgehen kannst. Die von Abt geschilderte hätte eine Änderung der Datenstruktur zur Folge.
Eine andere wäre z.B. mithilfe von JsonObject (Docs) oder JsonDocument (Docs) und dem JSON DOM zu schauen, was der korrekte Typ ist.
Alternativen gibt es noch einige - eigene JsonConverter z.B.
Ohne einen Service registriert zu haben, wird dir beim erstellen der Component eine Exception erscheinen.
Du könntest einfach einen DesktopDialogService implementieren, der einfach nichts macht (oder das Äquivalent von den Dialogen auf Desktop Ebene darstellt).
Hi,
was ist denn myDataStream für eine Datenquelle? Ist das ein Stream?
Wenn du dort aktuell nur eine 0 ausgelesen bekommst, wirst du einfach weiter lesen müssen und dann entweder an CurrentData appenden oder setzen müssen, damit weitere Daten auf deiner UI angezeigt werden.
Das Prinzip kannst du auch in WPF, UWP und WinUI3 verwenden.
Was für dich vielleicht sinnvoller ist, wäre das umgekehrte Prinzip. Versuch dich mal in der Microsoft Dokumentation in Dependency Injection einzulesen.
Wenn ich dich richtig verstanden habe, willst du in Abhängigkeit von einer Aktivierung o.ä. bestimmte Buttons aktivieren. Also besteht eigentlich keine Abhängigkeit der Visualisierung, sondern eine Abhängigkeit zu den Rechten des aktuellen Anwenders. Diese Rechte könntest du super in einem als Singleton gescopten Service verwalten und über Events oder Subscriptions die Visualisierung benachrichtigen.
Du willst die aber aggregieren?
Was wäre denn deine Kriterien, damit am Ende true herauskommt / bzw was soll bei dem string herauskommen?
Hi,
sind das Listen mit gemischten Typen oder symbolisieren die "Listen" jeweils Objekte?
Sofern du gemischte Typen hast:
Erstelle dir eine Klasse/Record mit benannten Properties und füge von dieser jeweils eine Instanz (je eine Instanz für Liste 1, 2, 3) zu einer Liste hinzu. Dann kannst du auf der Basis aggregieren.
Vergleichen könntest du sie auf integer Basis (was etwas komplizierter ist, denn der Computer arbeitet auf binarbasis und du willst auf zehner basis vergleichen) oder auf string Basis.
Für den Anfang ist die string Variante vermutlich einfacher. Grob: Wandele die Zahl in einen string um, schaue für jeden char ab dem zweiten ob er gleich dem vorderen ist.
Du wirst die CSV Datenspalte parsen müssen. Beim einlesen ist es ja nur ein String.
DateTime (Docs) bietet dafür die statische DateTime.TryParseExact (Docs) Methode an, die auch ein Format entgegennimmt.
Ob du jetzt die Subsekunden Auflösung bei Bankauszügen benötigst sei dahingestellt 🙂 aber DateTime kann diese auch verwalten.
Dazu sei gesagt: [FAQ] DateTime vs. DateTimeOffset und der Umgang mit Zeiten in .NET
Es gibt verschiedene fertige Libs, die das parsen von CSV vereinfachen. Da musst du dann nicht so viel selber programmieren. Auf Anhieb fällt mir CsvHelper ein.
Die Antwort auf deine Frage
Konkrete frage: Wie kann ich die lokale Methode (mit der Liste welche nur in Main-Classe verfügbar ist) von einer anderen Klasse (Splash) aufrufen?
ist, indem du entweder eine Statische Methode in der anderen Klasse erzeugst und diese aufrufst, oder in deinem Splashscreen eine Instanz der anderen Klasse erzeugst.
Das löst allerdings dein Problem - wenn, dann nur temporär - nicht.
Was du eigentlich möchtest ist eine saubere [Artikel] Drei-Schichten-Architektur und eine Initialisierung der Datenschicht.
Merkst du, dass das wahnsinnig kompliziert ist, so wie du es aufgebaut hast?
Generell baut man sich für soetwas ein Datenmodell (Grundlegend ist das in [Artikel] Drei-Schichten-Architektur erklärt), in dem Fall würde es reichen sich die Anzahl Tore zu in einem Feld zu speichern (ganz pragmatischer Ansatz) und dann jeweils nur das berechnete Ergebnis in das Textfeld zu schreiben oder gleich auf Datenbindung zu setzen, anstatt jedesmal den geschriebenen string wieder in eine Zahl zu parsen - was übrigens dazu führt, dass dein Programm abstürzt wenn dort einmal keine Zahl drin steht.
Das ist so, weil du immer Text anhängst.
Da wir wissen, was in deinem Control steht, eine generelle Empfehlung:
Bau dir den Text zusammen, so wie er dort stehen soll, z.B. mit
string text = $"Tore {mannschaftstore}";
und setze ihn dann, anstatt zu appenden.
Hi,
deine Frage ist recht allgemein formuliert und lässt deswegen viel Spielraum beim beantworten.
Das if statement erwartet in den Klammern einen Ausdruck, welcher einen boolschen Wert (also wahr oder falsch) ergibt. File.Exists gibt bereits einen boolschen Wert zurück, deswegen ist bei dem Ausdruck File.Exists() == true das == true überflüssig, File.Exists ist bereits true. Für false gilt dasselbe, nur eben mit einer negierung.
Wenn du nur prüfen möchtest, ob eine Datei existiert, dann würde also reichen:
if (File.Exists(nameBackup))
{
// datei existiert
}
else
{
// datei existiert nicht
}
Du könntest die Fehlermeldung Loggen, z.B. in eine Datei. Am besten mithilfe eines ordentlichen Logging und Exception Handling Konzeptes.
Wie startest du denn die Anwendung? Per Doppelklick?
Wenn du sie aus einer Console startest, siehst du auch alle ausgaben.
Die Konvertierung von DateTime nach DateTimeOffset funktioniert über einen impliziten Cast.
Aus dem Quellcode von DateTimeOffset:
public static implicit operator DateTimeOffset(DateTime dateTime)
Die Konvertierung sorgt dafür, dass wenn du eine DateTime Objekt übergibts, dass als Kind "Local" ist, die Zeitzone des aktuellen, den Code ausführenden Systems an das neue DateTimeOffset objekt übergeben wird. Ist dein DateTime Objekt UTC, wird ein DateTimeOffset objekt mit Offset = 0 erzeugt.
Es kann dabei zu Problemen kommen, wenn du ein Datum auf einem System verarbeitest, dass in einer anderen Zeitzone steht und du dies nicht erwartest.
Ich würde nach Möglichkeit darauf verzichten DateTime und DateTimeOffset zu mischen.
Hi,
ich habe selber keinen MAC, es gibt allerdings Technologien, die von .NET unterstützt werden aber nicht auf dem MAC lauffähig sind.
Das sind z.B. Windows Forms und WPF.
Die ARM Plattform von Apple wird auch "erst" mit .NET 6 unterstützt.
Dein HttpClient macht nichts, du verwendest in deinem Code weiterhin den HttpWebRequest.
Ich hab mir das Projekt nicht angeschaut, bin aber über das hier im Thread gestolpert:
namespace dotnetProTest { internal enum Colors { RedColor } }
Wichtig, daß der Lokalisierungs Name Genau den selben Namen hat, wie die Enum selbst.
Wenn hier wieder Namen übereinstimmen müssen - wo ist dann die Typsicherheit?
Da müsste dann eher ein Quellcode Generator dazwischen, damit das wieder typsicher ist, sonst könnte mir passieren, dass ich den Enum Eintrag RedColour nenne und nichts geht mehr?
Wenn du nur nach Datum (und vermutlich Zeit) filterst, könntest du auf den Table Storage gehen. Der ist günstiger als Cosmos DB und bei richtig gewähltem PartitionKey und RowKey geht das einfache filtern auch sehr gut.
Authentication Provider zur Laufzeit zu ändern ist durchaus Möglich (wertfrei), es gibt da eine passende Implementierung:
https://github.com/Aguafrommars/DynamicAuthProviders
Meines Wissens ist diese entstanden um IdentityServer 4 zur Laufzeit weitere Federations zu ermöglichen.
Die Controller Action macht eigentlich etwas anderes oder? Ich bin etwas verwirrt 🙂
Was genau klappt denn nicht?
Document document = await _context.Documents.FindAsync(eId);
// document != null ?
document.Total = _context.PaymentInformations
.Where(b => b.Document.Id == eId)
.Sum(a => a.PaymentSum);
await _context.SaveChangesAsync();
Sollte prinzipiell das machen, was du möchtest. Die PaymentSum aller PaymentInformations dieses einen Dokuments auslesen und aufsummieren.
Da du aber die neue, übergebene Entität erst danach in die Datenbank speicherst wird diese fehlen.
Ich empfehle einen Blick in den Artikel über [Artikel] Drei-Schichten-Architektur
Direkt mit der Datenbank wirst du nicht um pollen (abfragen) herumkommen.
Bei solchen Anforderungen setzt man (idr. setzt man immer einen) (Web-)Service zwischen deine Programme und die Datenbank um dann mit Push-Technologien wie z.B. SignalR die Clients zu informieren.
Alles in Code Tags zu schreiben ist nicht so angenehm zu lesen 🙂
Siehst du den Unterschied zwischen Doku und deiner Implementierung? Du willst einen UInt-Pointer übergeben, erwartet wird ein LPCWSTR. Ein Int16 ist ein short in C#.
Das kommt natürlich auf die interne Datenrepräsentation an.. und kann auch eine Design Entscheidung sein.
Das was du siehst ist ja nur das Frontend der Software und was dort angezeigt wird oder auswählbar ist hat nichts mit dem zu tun, wie etwas hinterher abgespeichert wird.
Erstelle dir eine Klasse (dafür gibt es Generatoren, die aus dem JSON C# Code erstellen) und lass es dir in diese deserialisieren.
Das würde dir übrigens auch eine Bibliothek wie Refit abnehmen.
Übrigens: der HttpWebRequest, den du verwendest ist veraltet (auch das würde dir refit abnehmen).
Das klingt ganz gut.. ist aber etwas komplexer in der Umsetzung als der ISourceGenerator.
Vielen Dank - schaue ich mir mal an
Das kannte ich schon, aber das hilft tatsächlich.
Ich hole mir einfach alle namespaces aller Klassen und nehme den kürzesten.
Alternativ: mit einem eigenen Namespace arbeiten.
Besten Dank!
Die Gewinnbedingung ist ja, dass drei gleiche Felder in einer Reihe sind. Wenn du also die einzelnen Felder durchgehst würde es reichen alle angrenzenden zu schauen und schauen ob diese übereinstimmen und der gegenüberliegende auch.
Du brauchst (ohne Optimierungen) also nur die inneren Felder durchlaufen und jeweils die angrenzenden Felder prüfen.
Wenn du mit Scopes (geschweiften Klammern) arbeitest kannst du dir die zweite Schleife sparen.
Schau dir das mal mit dem Debugger an.
Du greifst dort auf die Cells Eigenschaft einer Zeile zu, die alle Zellen der Zeile enthält.
Durch das ToString() erhälst du keinen Fehler, der Rückgabewert von ToString() ist aber vermutlich immer derselbe.
Oh cool.. das ist eine gute Quelle für Lösungen, die ich bei mir noch unschön finde.
Problem an der Namespace Lösung bei Refit ist, dass ich ein INamedTypeSymbol bräuchte... ich könnte halt irgendeins nehmen oder das, was den kürzesten Namespace Namen hat.
Schade, dass der Default Namespace kein Teil der Kompilierung ist, nur Teil des Projektes 🙂
Hi,
ich erstelle gerade einen ISourceGenerator und möchte diesen nicht nur in Projekten mit Main Methode, sondern auch in Klassenbibliotheken einsetzen.
Der Generator erstellt eine Erweiterungsmethode in einer eigenen Klasse für den DI Registrar. Als Namespace möchte ich gerne den Basisnamespace der Lib einsetzen, damit die Erweiterungsmethode direkt verfügbar ist.
In ausführbaren Projekten erhält man den Namespace der Main Methode relativ simpel über
baseNamespace = context.Compilation.GetEntryPoint(context.CancellationToken)?.ContainingNamespace.ToDisplayString();
In einer Klassenbibliothek ist die Rückgabe von GetEntryPoint() allerdings null. Dort behelfe ich mir mit
baseNamespace = context.Compilation.Assembly.MetadataName;
Das ist nicht optimal, denn dieser kann anders sein - sagt schon der Kommentar. Die Property Name ist mit ähnlichen Einschränkungen belegt.
Ich hatte überlegt einfach die Namespaces durchzugehen und aneinanderzusetzen und zu schauen ab wann ich das erste mal eine Typdefinition finde - das finde ich allerdings unsauber (Namespace Parts in der Assembly erhält man via context.Compilation.Assembly.NamespaceNames).
Irgendwie fehlt mir die saubere Lösung.
Ohne jetzt den Bug beschönigen zu wollen.
Zeitstempel sind mit eine der komplexeren Sachen, die man programmieren kann, gerade wenn man Hardwarenah oder mit einer älteren, evtl. portierten Codebasis unterwegs ist.
Aber einen Zeitstempel Dezimal in ein binäres System zu pressen ist schon „interessant“.
Moin,
Ich erliege gerade einem seltsamen Problem, für dass ich die Lösung nicht alleine finde.
Ich habe zwei Controller, die ähnlich aussehen:
Ich binde hier ein record an die Query Parameter mittels des FromQuery Attributs. Die records der beiden Controller haben dieselben Properties.
Bei dem einen Controller funktioniert das blendend, es werden alle Properties gebunden, sobald diese als Query String vorhanden sind, bei dem anderen Controller wird allerdings die eine Property nicht gebunden und ist immer null, während ich sie im Query Property des Requests aber sehen kann.
Was ich bereits ausgeschlossen habe:
(Nicht, dass ich einen der Punkte erwartet hätte, aber ich wollte es ausschließen)
Was könnte es noch sein und wie kann ich das sinnvoll debuggen? Mein Versuch mit Modelbindern dahinter zu kommen scheitert dann daran, dass der Modelbinder alleine schon das komplette Konstrukt in ASP.NET Core 6 aushebelt und der Binder selber verantwortlich ist.
Hi,
wenn du Daten von einem Benutzer einliest, musst du immer sicherstellen dass valide Daten vorliegen - vor allem dann, wenn du den eingegebenen string Datentyp in einen anderen Datentyp umwandelst.
Dieses umwandeln nennt sich parsen.
Stell dir vor, ich als Anwender gebe an dieser Stelle keine Ganze Zahl oder sogar einen Buchstaben ein:
int output = Convert.ToInt32(Console.ReadLine());
Das würde ein Programm zum Absturz bringen.
Als Eingabe in deine Methode Exchange gibst du verschiedene Zahlenwerte, diese sind innerhalb der Methode selber nicht sprechend - betrachtet man die Methode unabhängig, dann kann der Entwickler dort nicht wissen, was die Bedeutung von input = 1 ist.
Eine Möglichkeit hier wäre ein enum zu verwenden.
Anstelle der if/else Kombination würde sich ein switch oder eine switch expression anbieten.
Das ist etwas zu kompliziert als Lösung für dein Problem, man könnte hier aber mit einem Factory Pattern herangehen und für jede Konvertierung eine eigene Implementierung eines ICurrencyExchange Interfaces implementieren.
Wie du siehst führen immer ganz viele Wege ans Ziel. Welcher dabei der richtige ist, hängt immer an den Anforderungen die du selber oder jemand anders an deine Applikation stellt.
Das kommt ganz auf deine Umgebung an.
In Azure gibt es die Möglichkeit das in einen Key Vault (Geheimnisspeicher) auszulagern. Azure übernimmt dann die Bereitstellung der Authentifizierung ggü. dem Key Vault.
On Prem gibt es andere Anbieter, HashiCorp Vault z.B.
Ich würde dir empfehlen, dir einmal den Prozess aufzumalen und zu visualisieren.
Wenn dein Background Service keine parallele Verarbeitung kann, wird er immer nur ein Item aus der Queue entnehmen und verarbeiten. Ein neues Item wird dann in der Queue verbleiben, bis die Verarbeitung des vorherigen abgeschlossen ist.
Hast du denn schon einmal Beispiel Implementierungen gemacht und ein wenig herumgetestet?
Was möchtest du denn mit den Exceptions erreichen?
Der BackgroundService ist in sich geschlossen, eine Exception würde dazu führen, dass er abstürzt. In deiner App ist er nur insofern eingebettet, dass er an den Lifecycle der Applikation gebunden ist.
Wer sollte die Exception fangen?
Das sollte Basic Authentication sein - hoffe ich 🙂
Kommt, wenn du im Browser versuchst das aufzurufen eine Anmeldeseite vom Browser (als Popup)?
Falls ja, dann ist das, was der Browser macht wenn du User und PW vor der URL mit angibst Basic Authentication. Der Browser erzeugt für deinen Request einen Authentication Header mit Wert $"{user}:{pass}" als Base64 kodierten Wert.
P.S.: Auf Result zugreifen solltest du vermeiden. Wenn du await nicht verwenden kannst, nimm GetAwaiter().GetResult().
Das kommt drauf an, wie du das gestaltest.
Der Channel an sich ist Thread Safe (auch eine ConucrrentQueue wäre hier möglich, das ist nur ein Beispiel).
Am besten du liest einfach die Doku hinter dem Link, den ich gepostet habe. Der Rest hängt davon ab, ob du parallelisieren kannst.
Hi,
hier gibt es mehrere Möglichkeiten damit umzugehen.
Dein Ziel wäre es ja, die Datenbank Verarbeitung asynchron im Hintergrund laufen zu lassen.
Du kannst die Verarbeitung mit der Datenbank bspw. einfach in einem IHostedService auslagern mit einem Channel mit diesem kommunizieren.
Das wird du berechnen müssen, was da am besten für dich ist.
Bei Blobs kostet dich der Traffic nichts (eingehend in Azure), wohl aber die Anzahl an Requests.
Blob Storage bietet dabei z.B. AppendBlobs an, die du in beliebigen Größen immer wieder erweitern kannst (Ich habe das allerdings bisher nur mit Text Formaten gemacht - wüsste aber nicht, was gegen Binärformate sprechen sollte). Du musst allerdings mehrere Requests machen um etwas anzufügen (Properties lesen, Lease erstellen, Upload, ggf. Lease erneuern, Lease entfernen)
BlockBlobs kannst du als Chunk hochladen - hier wäre vermutlich aber der Blob weg, wenn du den PC neustartest.
Prinzipiell kann man da leider nur sagen: Kommt auf deine Anforderungen an.
Damit das nicht zu einem "Zugriff auf DB direkt oder indirekt"-Thread wird, nur zwei Dinge zu bedenken:
Es kommt immer sehr genau auf das Szenario an, ob ein direkter Datenbank Zugriff gewollt sein kann. Dabei spielt neben der Sicherheit (Jeder Anwender benötigt Datenbank Zugriff, Jeder Anwender HAT Zugriff auf die Datenbank und kann nicht nur das machen was ihm die Anwendung erlaubt, Datenbank ist über Netzwerk erreichbar, ...) auch Lizenzen eine Rolle, bei CAL's kann es sein, dass bei direktem Zugriff für jeden Anwender eine Lizenz erforderlich ist.
Der Release candidate (RC) ist in die reguläre Version überführt.
Die Preview Version (separat herunterzuladen) bekommt vorab Updates.
Du solltest vermeiden aus deiner GUI Anwendung direkt auf eine Datenbank zuzugreifen, sondern über eine HTTP API gehen.
Anfangs hast du nach möglichen Frameworks gefragt. Du könntest die Desktop Applikation weglassen und eine auf ASP.NET Core basierte Webapplikation entwickeln.
Entweder direkt Server gerendert (dann hast du nur eine Applikation) z.B. mittels RazorPages (da solltest du mit dem Stichwort gute Beispiele finden) oder mit einer Single Page Application (dann hast du allerdings zwei Applikationen die du entwickeln musst).
Das klingt nach Wilhelm Büchner Hochschule... 🙂
Prinzipiell ist nichts falsches daran, den User Ordner zu nutzen, vor allem den Documents...
Ist "admin" dein eigener Benutzername oder der eines anderen?
In .NET gibt es die Möglichkeit den Benutzerordner auszulesen, dann ist der Ordner auf jeden Fall der richtige. SChau dir dafür Environment.GetFolderPath (Api-Docs) an.
Ich bin mir nicht sicher, aber eventuell kommt die Unauthorized Exception auch dann, wenn der Ordner nicht existiert(?), was ein Tippfehler sein könnte.