Archief - [VB.NET] Nullable Type

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Duffman-

Legacy Member
Hey,

ik ben bezig met het maken van een applicatie en zit nu met een klein probleempje. Het gaat om een schoolopdracht en je moet verplicht werken met Nullable types.
Ik heb in mijn klasse die een record van een database moet voorstellen.
Één van de variabelen is als volgt gedefinieerd:
Code:
    Private mStartjaar As Nullable(Of Integer)

met bijbehorende property:
Code:
    Public Property startJaar() As Nullable(Of Integer)
        Get
            Return mStartjaar
        End Get
        Set(ByVal value As Nullable(Of Integer))
            If value = Nothing Then
            Else
                mStartjaar = value
            End If
        End Set
    End Property

Nu vroeg ik mij af ... hoe kan ik deze variabele (mStartjaar) instellen op Null?
Als ik hem als volgt instel:
mStartjaar = Nothing
geeft hij volgende error: Kan de kolom Startjaar niet instellen op null. Gebruik in plaats daarvan DBNull.

wanneer ik de variabele dan als volgt instel
mStartjaar = DBNull
of
mStartjaar = DBNull.Value krijg ik een build error omdat je dat niet kan converten naar integer.(option strict staat aan)

Weet er iemand hoe je precies met deze nullable types moet werken en wat ik hier verkeerd doe?


Greetz,
Duffman-

Cycloon

Legacy Member
Je moet natuurlijk wel je property gebruiken.

startJaar = Nothing

En je if test is helemaal niet nodig in die property, geen idee waarom je die daar hebt staan.

Code:
    Public Property startJaar() As Nullable(Of Integer)
        Get
            Return mStartjaar
        End Get
        Set(ByVal value As Nullable(Of Integer))
            mStartjaar = value
        End Set
    End Property

Duffman-

Legacy Member
Ja als ik dat doe krijg ik volgende error:
Kan de kolom Startjaar niet instellen op null. Gebruik in plaats daarvan DBNull.
En ik denk dat ik die if-constructie gebruik omdat ik een verkeerde opvatting heb over het gebruik van nullable types.

Cycloon

Legacy Member
Het probleem ligt dan alleszins niet aan het nullable type want ik heb het hier getest. Waarschijnlijk probeer je die waarde dan in je database te stoppen maar kent die dat type niet. Daar kan ik je helaas niet mee helpen :)

Duffman-

Legacy Member
Hey Cycloon,

alvast bednakt voor je hulp. Wanneer ik wél iets invul in de control die data bevat voor startjaar op mijn form, geeft het programma geen problemen. Alleen wanneer ik die control leeglaat doet het prog lastig.

Dit is de database: http://users.telenet.be/duffman/LeegConcert.mdb
(weet niet of je access hebt. Ik weet dat het een simpele database is maar dat was deel van de opdracht. 3 tabelletjes in een access-database. Het slaat immers ni op het databanken gedeelte maar op het programmeer-gedeelte.)

//edit:
code die ik gebruik om de property aan te spreken:
If cboStartjaar.SelectedText.ToString.Equals("") Then
artiest.startJaar = DBNull.Value
Else
artiest.startJaar = CInt(cboStartjaar.Text)
End If

Maar dan krijg ik de syntaxfout dat dbnull niet geconvert kan worden naar integer.

Cycloon

Legacy Member
Maar het ding is dat je daar alles moet invullen Nothing. Het is pas als je data in je database gaat steken dat je moet kijken of er geen "Nothing" aan te pas komt en zoja dan DBNull in uw database te steken en niet die Nothing uit uw variabele.

Duffman-

Legacy Member
Ik begrijp niet helemaal wat je bedoelt. Kan je het misschien uitleggen aan de hand van een voorbeeldje of is het teveel code? Waar moet je precies alles invullen met "nothing"? Ik check nu of mijn combobox is opgevuld of niet in mijn form-klasse en dit gaat ook nergens anders. Die property staat in een andere klasse dan mijn form-klasse ...

Cycloon

Legacy Member
Code:
If cboStartjaar.SelectedText.ToString.Equals("") Then
artiest.startJaar = Nothing
Else
artiest.startJaar = CInt(cboStartjaar.Text)
End If

Nu is er waarschijnlijk een plaats waar je de datatabel van je databank gaat opvullen. Ik weet niet hoe je werkt dus ik kan niet specifiek zijn. Maar je zal alleszins ergens gaan toewijzen dat die startJaar ergens in moet komen. Je doet zoiets als:

databankVeld = artiest.startJaar

Nu moet je hier eerst gaan kijken of je geen Nothing hebt:

if artiestJaar is Nothing then
databankVeld = DBNull.Value
else
databankVeld = artiest.startJaar
end if

Het kan zijn dat het op een betere manier kan maar ik ben geen VB.NET held (vergeef mij overigens mogelijke syntax fouten).

Duffman-

Legacy Member
It's alive!
Jullie hadden inderdaad gelijk. Ik wou mijn waarde van startjaar al te vroeg instellen op dbNull.

Code:
            If (nArtiest.startJaar.HasValue) Then
                drv("startjaar") = nArtiest.startJaar.Value
            Else
                drv("startjaar") = DBNull.Value
            End If

Bedankt hé mannen ... zat er echt op vast. Nu kan ik wel weer verder.:)

Duke_Puke

Legacy Member
Misschien ook juist een syntax opmerkinig:
Ipv "cboStartjaar.SelectedText.ToString.Equals("")" te gebruiken, is het beter de built in String klasse van .NET te gebruiken.

Dan wordt het If String.IsNullOrEmpty(cboStartjaar.SelectedText.ToString), is net dat ietsje properder om mee te werken (is juist een klein tipke)

Moto

Legacy Member
Misschien nog een dwaas opmerkingske over al die schoolopdrachten die ik hier zie passeren.
Dat nederlands, is dat verplicht of is dat vrij te kiezen.
Als ge vrij moogt kiezen kunt ge beste de gewoonte aanleren om alles in het engels te doen

Bedoel dus cboStartjaar -> cboStartYear enzo...

Obliv`

Legacy Member
Moto zei:
Misschien nog een dwaas opmerkingske over al die schoolopdrachten die ik hier zie passeren.
Dat nederlands, is dat verplicht of is dat vrij te kiezen.
Als ge vrij moogt kiezen kunt ge beste de gewoonte aanleren om alles in het engels te doen

Bedoel dus cboStartjaar -> cboStartYear enzo...

En om me de trends mee te gaan, laat je ook beter dat hungarian gedoe achterwegen ;).

Moto

Legacy Member
En om me de trends mee te gaan, laat je ook beter dat hungarian gedoe achterwegen.
Voor variabelen zowiezo maar voor controls doe ik dat ook nog altijd ze :p
Ken mensen die startYearComboBox doen bijvoorbeeld maar vind dat beetje overkill, zie nog altijd liever cboStartYear :)

Obliv`

Legacy Member
Moto zei:
Voor variabelen zowiezo maar voor controls doe ik dat ook nog altijd ze :p
Ken mensen die startYearComboBox doen bijvoorbeeld maar vind dat beetje overkill, zie nog altijd liever cboStartYear :)

Daar ben ik er één van :), maar inderdaad voor UI-elementen wordt de hungarian notation nog wel aanvaard.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan