2009-07-14 15 views
20

I tipi Nullable possono essere utilizzati in VB.NET? In tal caso, è possibile avere un numero intero Nullable che posso utilizzare con un campo che accetta NULL in SQL Server? Esempi sarebbero apprezzati.Tipi Nullable in VB.NET?

risposta

34

Non è possibile assegnare Null, Nothing o DBNull a un numero intero in VB. È possibile possibile utilizzare uno Nullable(Of Integer) invece di farlo, oppure inserire il valore intero in un Object (che può essere Nothing).

+2

infatti, è possibile assegnare Niente da un numero intero in VB.NET: 'Dim a As Integer = Nothing' Ma dopo, il seguente è vero: ' a = 0' – Jochen

7

I numeri interi (System.Int32 ecc.) In .NET non sono direttamente annullabili; tuttavia, c'è Nullable-of-T che ti consente di creare qualsiasi valore nullable-ish. Si noti che potrebbe essere necessario controllare il database con DBNull anziché con lo null/Nothing.

Quindi sì, si può fare qualcosa di molto simile.

1

No. Dovrai modificare l'inserimento o aggiornare la query per non aggiungere (o aggiornare) quel valore per ottenere un valore null nel database.

43

VB.Net ha tipi nullable, possono essere dichiarati nei seguenti due modi diversi.

Dim iNullable As Integer? 

o

Dim iNullable As Nullable(Of Integer) 
+1

In realtà ci sono [3 modi] (https://msdn.microsoft.com/en-us/library/ms235245 .aspx): Dim iNullable? come numero intero –

3

In un certo numero di casi Nothing otterrà convertito al valore di default. Per utilizzare Nothing nello stesso modo in cui si utilizza null è necessario eseguire il cast sul tipo nullable corretto.

Dim str As String 
Dim int As Nullable(Of Integer) ' or use As Integer? 
Dim reader As SqlDataReader 
Dim colA As Integer = reader.GetOrdinal("colA") 
Dim colB As Integer = reader.GetOrdinal("colB") 
str = If(reader.IsDBNull(colA), DirectCast(Nothing, String), reader.GetString(colA)) 
int = If(reader.IsDBNull(colB), DirectCast(Nothing, Nullable(Of Integer)), reader.GetInt32(colB)) 
1

unico modo che conosco per entrare NULL di in db da codice client (come richiesto nei commenti qui sotto questione) è quello di utilizzare i valori di default in SQL uguale a null.

Quindi, in stored procedure di aggiornamento/inserimento si può usare qualcosa di simile a:

create proc dbo.UpdateSomeTable 
    @Id int, 
    @Status bit = NULL 
as 
begin 
    update dbo.SomeTable 
    set Status = @Status 
    where Id = @Id 
end 

e da qualche parte nel codice

Dim pars As List(Of SqlParameter) = New List(Of SqlParameter) 
With pars 
    .Add(New SqlParameter("@Id", LogbookNoteId)) 
    If Flag Then 
     .Add(New SqlParameter("@Status", Flag)) 
    End If 
End With 
ExecuteNonQuery("dbo.UpdateSomeTable", pars, CommandType.StoredProcedure)