webForumDet fria alternativet

Spara NULL?

5 svar · 515 visningar · startad av Travoni

TravoniMedlem sedan okt. 20041 556 inlägg
#1

Jag har en property (SId) och en parameter som skall hämta värdet. Men kruxet är att databasen skall "spara" ett null-värde om SId inte innehåller något och i mitt fall så sparas 0 [En nolla] i databasen.

       Public Property SId() As Integer
            Get
                If Not IsNothing(ViewState("SId")) Then Return CType(ViewState("SId"), Integer)
                Return Nothing
            End Get
            Set(ByVal value As Integer)
                ViewState("SId") = value
            End Set
        End Property

' Mer kod ...

command.Parameters.Add("?sId", MySqlDbType.Int32).Value = sId

Vad är fel?

spangoMedlem sedan juni 20008 205 inlägg
#2

Gör om SId till Nullable(Of Integer) istället för Integer? Integer är en value type och har således aldrig nullvärde.

TravoniMedlem sedan okt. 20041 556 inlägg
#3

Härligt!
Visste inte att det fanns något som hette Nullable()

TravoniMedlem sedan okt. 20041 556 inlägg
#4

... följdfråga.

Eftersom att den fetmarkerade raden kan vara DBNull så funkar det inte med Integer.
Om jag kör med rad 1, så får jag typcastingfel.
Rad 2 fungerar med det känns lite fel...

Rad 1
Dim ParentId As Nullable(Of Integer) = [B]DataBinder.Eval(e.Item.DataItem, "ParentId")[/B] 

Rad 2
Dim ParentId As Object = DataBinder.Eval(e.Item.DataItem, "ParentId")
spangoMedlem sedan juni 20008 205 inlägg
#5

Ja, Nullable(Of Integer) är en helt annan datastruktur än Integer, så det är förklarligt att det inte går att casta om Eval returnerar en boxad Integer. (Nullable är bara en generisk struct som är lite fiffigt uppbyggd, kolla dokumentationen.) Jag har dålig pejl på hur DataBinder.Eval funkar, men kan du inte göra om ParentId till Nullable också? Annars får du göra nåt i stil med detta (som en övning får du det i C#):

public static Nullable<T> EvalNullable<T>(object container, string expression) where T : struct {
    object value = DataBinder.Eval(container, expression);
    if (value == null) return null;
    else return new Nullable<T>((T)value);
}
TravoniMedlem sedan okt. 20041 556 inlägg
#6

Oki, tack vad bussigt:

Public Shared Function EvalNullable(Of T As Structure)(ByVal container As Object, ByVal expression As String) As Nullable(Of T) 
    Dim value As Object = DataBinder.Eval(container, expression) 
    If value Is Nothing Then 
        Return Nothing 
    Else 
        Return New Nullable(Of T)(DirectCast(value, T)) 
    End If 
End Function

Nåt sånt hära kanske då.

140 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)