IsFieldNull funktioniert nicht



  • Hallo!

    Ich habe einige Felder in meiner Datenbank die auch NULL sein können. Der Zugriff erfolgt mit CRecordset.

    Nun will ich wissen ob ein bestimmtes Feld auch wirklich NULL ist - und da kriege ich IMMER FALSE. Egal ob was drin steht oder nicht. In der DB ist es korrekt (also NULL oder eine Zeit) aber im Programm ist es falsch.

    Hier kommen die Schnipsel:

    bool m_fMontag = !(pDoc->GetDaten().IsNullMontag());
    
    inline bool CFilialenSet::IsNullMontag()
    {
    	return (IsFieldNull(&m_tmMoVon) == TRUE);
    }
    

    Was ist da falsch? Habe ich in der MSDN was übersehen? Gibt es eine andere Möglichkeit?

    Ich könnte zusätzliche Werte in die Tabelle machen, um damit die Checkboxen korrekt füllen zu können - aber dann habe ich das Problem mit Sicherheit später an anderer Stelle. 😞

    Also, was habe ich falsch gemacht oder übersehen?



  • Servus,

    ich habe keine Ahnung.......
    liegt es vielleicht daran:

    MSDN schrieb:

    Remarks
    Call this member function to determine whether the specified field data member of a recordset has been flagged as Null. (In database terminology, Null means "having no value" and is not the same as NULL in C++.) If a field data member is flagged as Null, it is interpreted as a column of the current record for which there is no value.

    Note This member function is not applicable on recordsets that are using bulk row fetching. If you have implemented bulk row fetching, then IsFieldNull will always return FALSE and will result in a failed assertion. For more information about bulk row fetching, see the article Recordset: Fetching Records in Bulk (ODBC).
    IsFieldNull is implemented through DoFieldExchange.

    😕

    Vielleicht hilft es dir weiter.....

    *winke*
    Hellsgore



  • Das ist es eher nicht. IsFieldDirty würde auch nicht gehen, aber das funktioniert.

    Liegt es vielleicht wieder am Datentyp? Ich hatte ja neulich ein Problem mit dem selben Recordset was ich irgendwie behoben habe indem ich statt CTime COleDateTime nutze. Stimmt hier vielleicht etwas mit COleDateTime nicht?



  • Es kann vorkommen, dass ein sehr kleiner Wert, z.B. 0,986334 mal 10HochMinusEineMillion, bei leeren Datumsfeldern abgespeichert wird oder dass leere Datumsfelder als eben dieser sehr kleine Wert interpretiert werden.

    Für das Datum ist dieser Wert (wenn das Datumsformat z.B. in "vergangene Sekunden seit" besteht) trotzdem praktisch NULL (evtl. eine Millisekunde oder so) und fällt daher nicht als Fehler auf.

    Da aber der Computer sehr pingelig ist, behauptet er, dass es eben nicht NULL ist sondern nur aussergewöhnlichwahnwitzigmächtigverschwindendklitzeklein, aber keinesfalls ganz leer.

    Vielleicht liegt es daran.

    Möglichkeiten, die mir da so spontan einfallen:
    - überprüfen, ob der Inhalt z.B. kleiner als 0,0000001 ist -> wenn ja, dann als NULL behandeln
    - den Inhalt in ein Datum oder in eine Zeitspanne umwandeln und überprüfen, ob es ein gültiges Datum oder eine nicht winzige Zeitspanne ist



  • Dankeschön, die erste Lösung funktioniert prima.

    Eine Funktion sieht jetzt halt so aus:

    inline bool CFilialenSet::IsNullMontag()
    {
    	return ((int)m_tmMoVon < 0.000000000000001);
    // 	return (IsFieldNull(&m_tmMoVon) == TRUE);
    }
    

    Den Kommentar lasse ich zur Errinerung lieber drin.

    So, auf zum nächsten Fehler... nein, ich hab ja gar keinen mehr. Weitertesten! 🙂

    ⚠ ⚠ ⚠ ⚠ ⚠ ⚠
    Ging doch nicht so. Ich habe aber was pranktisches rausgefunden:
    Die Stunden und Minuten sind -1 wenn es in der Datenbank NULL ist.

    Ich prüfe jetzt also so:

    inline bool CFilialenSet::IsNullMontag()
    {
     	return (m_tmMoVon.GetHour() < 0);
    // 	return (IsFieldNull(&m_tmMoVon) == TRUE);
    }
    

    Und das geht wirklich!


Anmelden zum Antworten