Laden...

Datum auf leeres Feld in Access prüfen

Erstellt von Daze1302 vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.517 Views
D
Daze1302 Themenstarter:in
15 Beiträge seit 2017
vor 6 Jahren
Datum auf leeres Feld in Access prüfen

Moin zusammen.
Ich bin auf der Suche nach einer Möglichkeit, wie ich abfragen kann, ob ein Feld in einer Access DB leer ist, um dann eine Fehlermeldung auszugeben.

Hier der Code bisher:

                while (reader.Read())
                {
                    DateTime heute = DateTime.Today;
                    DateTime sicherheit = DateTime.Parse("" + reader["Gültigkeit_Unterweisung"]);

                    if (heute <= sicherheit)
                    {
                        tbNameAnzeige.AppendText("" + reader["Vorname"]);
                        tbNameAnzeige.AppendText(" ");
                        tbNameAnzeige.AppendText("" + reader["Nachname"]);
                    }
                    //reader.Close();
                    else if (heute >= sicherheit)
                    {
                        FormFehlerSicherheit s1 = new FormFehlerSicherheit(tbPersNr.Text);
                        s1.ShowDialog();
                        tbPersNr.Clear();
                    }
                    else
                    {
                        MessageBox.Show("Keine Sicherheitsunterweisung eingetragen");
                    }

Die erste Idee war ja if(sicherheit == ""), aber Datum mit string vergleichen läuft ja nicht so toll 😄

Letztendlich will ich nur vermeiden, dass mein Programm abstürzt, wenn man mal einen Nutzer einließt, welcher keine eingetragenen Daten hat, außer seinen Namen und seine ID. Eine Fehlermeldung scheint eleganter als ein Absturz.

Danke euch für jede Idee 😃

F
10.010 Beiträge seit 2004
vor 6 Jahren
  1. Abstürze wegen soetwas passieren wenn du kein vernünftiges Exceptionhandling machst.

  2. Schon mal die Funktionen deines DataReaders angeschaut?
    https://msdn.microsoft.com/de-de/library/system.data.oledb.oledbdatareader(v=vs.110).aspx
    Was bedeutet dort wohl
    "Ruft einen Wert ab, der angibt, ob die Spalte nicht vorhandene oder fehlende Werte enthält"

D
Daze1302 Themenstarter:in
15 Beiträge seit 2017
vor 6 Jahren

Sagt mir leider nicht viel. Ich sitz erst seit 3 Wochen an c# und darf daher noch viel lernen 😉

P
1.090 Beiträge seit 2011
vor 6 Jahren

Ich denke FZelle meint die Methode IsDBNull des DataReaders.
Schau mal hier: Using column name when using SqlDataReader.IsDBNull

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

286 Beiträge seit 2011
vor 6 Jahren

Schau dir mal den ??-Operator an:


string result = myReader[0] ?? "kein Wert";

Ist nur ein Beispiel, dass du so nicht verwenden solltest (fliegt dir z.B. um die Ohren wenn reader[0] kein string ist). Aber ?? ist gut geeignet wenn du Null abfangen willst.

Noch ein Tipp:
Lass die Finger von Access. Gerade wenn man alleine anfängt kommt man schnell auf Access, i know.
Auf Dauer wirst du damit aber keinen Spaß haben.

Wenn du für einen lokalen Client eine DB brauchst verwende lieber SQLite. Für Multiuser-Anwendungen musst du sowieso auf einen SQL-Server zugreifen.
Auf jeden Fall lieber von Anfang an die Finger von Access lassen 😃

Nachtrag:
Da es bei dir ja um Daten geht: DateTime ist eigentlich nicht nullable, daher verwende lieber DateTime?, dadurch kann die Variable auch den Wert Null annehmen.
Den Umweg über DateTime.Parse kannst du dir eigentlich auch sparen, wenn du das direkt castest.
Wenn du beim Parsen bleiben willst verwende lieber TryParse:


            DateTime sicherheit;
            DateTime.TryParse(reader["Gültigkeit_Unterweisung"], out sicherheit);

TryParse gibt einerseits ein bool zurück mit dem du kontrollieren kannst ob dein Parse erfolgreich war und andererseits kannst du "sicherheit" vorher noch einen Default-Wert mitgeben wenn du willst.

2+2=5( (für extrem große Werte von 2)

D
985 Beiträge seit 2014
vor 6 Jahren

@emuuu

AFAIK Bei SQL-NULL ist der zurückgelieferte Wert DBNull und eben nicht null. Der ?? Operator hilft hier also so nicht.

286 Beiträge seit 2011
vor 6 Jahren

Stimmt, hatte irgendwie im Hinterkopf, dass das beim OleDb anders war.
Wenn ich noch mit Readern arbeite, habe ich meist eine Klasse dazwischen die aus dem sql-Befehl direkt einen DataTable macht, daher null ^^

Für den SqlReader wäre es dann meine ich:


if(!SqlReader.IsDBNull(index))
{

}

edit: wie palin schon geschrieben hat.

2+2=5( (für extrem große Werte von 2)