Danke für die Hinweise. Ich habe deine (sheitman) Vorschläge eingearbeitet.
Bei der Gelegenheit habe ich die Anzeige der Anwendung etwas erweitert, sodass man Ostersonntag und Buß- und Bettag für ein "beliebiges" Jahr direkt prüfen kann. Damit kommen solche Fehler hoffentlich nicht mehr vor.
Ich wundere mich, dass ich den Buß- und Bettag nicht kontrolliert hatte. Ebenso wundere ich mich über die Convert-Anweisung beim Ostersonntag; solche Konstruktionen hatte ich eigentlich schon vor neun Jahren als schlechten Stil abgelehnt. Besser spät als nie korrigieren!
Die Version von Feiertage.zip habe ich entsprechend ergänzt.
Wichtiger Hinweis: Die vorstehende Berechnung genügt nicht: Zwei Ausnahmeregeln wurden bei den obigen Lösungen nicht in die Gaußsche Formel eingearbeitet. Der Ordnung halber folgt hier die berichtigte Berechnung:
/// <summary>
/// Errechnet das Datum des Ostersonntags aus dem übergebenen Jahr
/// </summary>
/// <param name="jahr">Das Jahr YYYY als integer-Wert</param>
/// <returns>Das errechnete Datum des Ostersonntags in dem angegebenen Jahr</returns>
private DateTime GetOstersonntag(int jahr)
{
int x = jahr; // das Jahr
int k; // die Säkularzahl
int m; // die säkulare Mondschaltung
int s; // die säkulare Sonnenschaltung
int a; // der Mondparameter
int d; // der Keim für den ersten Vollmond im Frühling
int r; // die kalendarische Korrekturgröße
int og; // die Ostergrenze
int sz; // der ersten Sonntag im März
int oe; // die Entfernung des Ostersonntags von der Ostergrenze
int os; // das Datum des Ostersonntags als Märzdatum (32.März = 1.April)
int OsterTag;
int OsterMonat;
k = x / 100;
m = 15 + (3 * k + 3) / 4 - (8 * k + 13) / 25;
s = 2 - (3 * k + 3) / 4;
a = x % 19;
d = (19 * a + m) % 30;
r = (d + a / 11) / 29;
og = 21 + d - r;
sz = 7 - (x + x / 4 + s) % 7;
oe = 7 - (og - sz) % 7;
os = og + oe;
OsterMonat = 2 + (int)(os + 30) / 31;
OsterTag = os - 31 * ((int)OsterMonat / 4);
return Convert.ToDateTime(OsterTag.ToString() + "." + OsterMonat + "." + jahr);
}
Auf diesen Fehler wurde ich kürzlich durch eine Änderung bei der Wikibooks-Algorithmensammlung aufmerksam gemacht.
Die hier stehende Version von Feiertage.zip habe ich entsprechend ergänzt.
Quelle: Gaußsche Osterformel (mit Ergänzung)
Hinweis: Der letzte Beitrag bei Osterformel nach Carl Friedrich Gauß enthält die vollständige Lösung.
Nachtrag: Die Anlage Feiertage.zip wurde ersetzt durch die korrigierte Version in meinem nächsten Beitrag (27.09.2016).
Mal wieder. Dabei stelle ich fest, dass ich vieles vergessen habe und hier erfolgreich suche - teilweise auch in meinen Beiträgen fündig werde.
Nur der Vollständigkeit halber:
eigenartig, dass so einfache dinge nicht "ordentlich" funktionieren,...
Ich bin gerade auch über das Problem gestolpert und habe hier die Lösung (KeyPress-Code von rechner) gefunden. Ich war ebenfalls überrascht, aber .NET arbeitet "as designed", siehe TextBoxBase.ShortcutsEnabled:
The TextBox control does not support the CTRL+A shortcut key when the Multiline property value is true.
Es ist schön, dass über myCSharp eine einfache Lösung zu finden ist. Jürgen
Was ist ein XSD Befehl? xsd ist XML-Schema, also die Festlegung wie ein XML-Dokument aussehen soll. Was du mit "aus DLL generieren" meinst versteh ich grad nicht.
Es gibt beides: Zum einen ist xsd eine Extension für ein xml-Dokument, das die Struktur eines DataSet beschreibt. Zum anderen gibt es xsd.exe, das daraus eine Designer.cs-Datei erstellt. Das ist aber "nur" ein typisiertes DataSet, kein TableAdapter.
Den TableAdapter selbst lehne ich ab: Bei diesem Datenmonster sind viel zu viele Abläufe versteckt, sodass man nicht weiß, was eigentlich passiert. Deshalb kann ich nichts dazu sagen, wie man auch xsc und xss bekommt. Ich befürchte, dass dies in der fertigen DLL nicht mehr enthalten ist, weil es um die Steuerung des Designers geht und nicht um die Laufzeit.
Gruß Jürgen
Die bisherigen Erklärungen sind völlig korrekt. Aber dein Code hat mit der Fehlermeldung wenig zu tun; deshalb können die Erklärungen nicht vollständig sein. Es fehlt der Hinweis darauf, woher thisRow eigentlich kommt (jedenfalls kann ich nichts erkennen). Jürgen
Siehe auch [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen) in den FAQ, also auch Wie poste ich richtig? 1.1 Erst suchen und in die Doku schauen, dann posten
[FAQ] Wie finde ich den Einstieg in C#?; in den FAQ sowie mit 🛈 📗 gibt es weitere Hinweise.
Jürgen
Und beachte auch Wie poste ich richtig? 2.2 Keine Crossposts wie dort. Jürgen
Kann es sein das die Update Methode von MySqlDataAdapter einen benutzt, und diesen aus irgenteinen Grund nicht mehr schließt.
Es ist denkbar, weil der DbDataAdapter auch den Erfolg des Speichern prüft. Das könntest du über den .NET Reflector kontrollieren.
Desweiteren stimmt das überhaupt so mit dem UpdateCommand?
Nein. Wenn du den UPDATE-Befehl manuell zuweist, muss er genau dem SQL-Befehl entsprechen, also mit SET, den Spalten und den Werten (natürlich als Parameter). Einfacher ist es, einen SELECT zuzuweisen; dann kann der DbDataAdapter sich die Speichern-Befehle in der Regel selbst erstellen (sofern der SELECT die Voraussetzungen erfüllt: kein JOIN, mit PrimaryKey).
Auserdem ist mir grad noch aufgefallen das es nur bei Tabellen geschieht wo es auch Änderungen gab.
Natürlich, so arbeitet die Update-Methode des DbDataAdapter, wie in :rtfm: beschrieben wird.
Alles zusammen ist das ein Grund mehr, sowohl DbConnection als auch DbDataAdapter in einem using-Block zu kapseln.
Gruß Jürgen
was die Ungenauigkeiten angeht, hab ich das nun so verstanden das es bei solchen Berechnungen besser wäre direkt auf decimal zurückzugreifen?
Nein, eher nicht. Beim BMI kommt es (anders als in der Buchhaltung) nicht auf Genauigkeit an; da passen double-Werte. Du musst nur bei den Vergleichen aufpassen, also dich nicht auf exakte Gleichheit verlassen.
Jürgen