Newsgroup: it.comp.lang.visual-basic
Titolo: Impostare un campo a NULL

Premetto che uso VB2005exp e SQL server 2005 exp.
Vorrei chiedere, come si fa ad impostare un campo a null ?
Per esempio ho una tabella del DB con 3 campi, due sono obbligatori e uno e' 
opzionale:
Nome   varchar(50)  No-null
Cognome  varchar(50)  No-null
Eta'  Int   Si-null
nel programma che ho fatto in visual basic la query e'
INSERT INTO miaTabella(Nome,Cognome,Eta) Values(Textbox1.text, 
Textbox2.text, Textbox3.text)
Ora...se inserisco dei valori nelle 3 textbox il programma funziona 
correttamente. Se invece lascio
la terza textbox vuota mi da errore perche' prova ad inserire la stringa 
vuota in un campo integer.
Come faccio a inserire Null nel terzo campo se l'utente lascia la textbox 
vuota ?
L'unica soluzione che ho trovato e':
if Textbox3.text="" then
INSERT INTO miaTabella(Nome,Cognome) Values(Textbox1.text, Textbox2.text)
else
INSERT INTO miaTabella(Nome,Cognome,Eta) Values(Textbox1.text, 
Textbox2.text, Textbox3.text)
Se i campi Opzionali sono molti, con questa soluzione diventa un casino.
Conoscete un'altra soluzione piu' pratica ?
grazie mille !! 

 Textbox2.text, Null)

 Textbox2.text, Null)
Ipotiziamo che tutti e 3 i campi siano opzionali.
Come dovrei fare ?
If Textbox1.text="" AND Textbox2.text<>"" AND Textbox3.text<>""
   INSERT INTO miaTabella(Nome,Cognome,Eta) Values(Null, Textbox2.text, 
Textbox3.text)
elseIf Textbox1.text<>"" AND Textbox2.text="" AND Textbox3.text<>""
  INSERT INTO miaTabella(Nome,Cognome,Eta) Values(TextBox1.text, Null, 
Textbox3.text)
elseIf Textbox1.text<>"" AND Textbox2.text<>"" AND Textbox3.text=""
  INSERT INTO miaTabella(Nome,Cognome,Eta) Values(TextBox1.text, 
Textbox2.text, null)
ecc.... ecc...
END IF
Possibile che questa sia l'unica soluzione ?

 ha scritto

una cosa tipo
dim s1 as string, s2 as string, s3 as long
s1=iif(trim(textbox1)<>"", trim(textbox1), null)
s2=iif(trim(textbox2)<>"", trim(textbox2), null)
s3=iif(trim(textbox3)<>"", val(trim(textbox3)), null)
INSERT INTO miaTabella(Nome,Cognome,Eta) Values(s1,s2,s3)
puo' andare?


Si, non è elegantissimo, ma funziona! ;-)
In generale, sarebbe preferibile farti una funzione che ti elabora il
valore da
passare al campo stringa del database in base al tipo in input,
specificando il comportamento dei campi che accettano Null.
In questo modo la tua istruzione Sql diventerebbe del tipo
"Insert Into (campo1,campo2,campo3) Values
(GetDbValue(value1,dwString,Null),GetDbValue(value2,dwString,Null),GetDbValue(value1,dwNumber,Null))"
Il secondo argomento della routine GetDbValue specifica il tipo del
campo, il terzo specifica il valore da impostare nel caso di stringa
di lunghezza zero o numero = 0.
Ciao

 ha scritto nel messaggio 
news:6736f0F...@mid.individual.net...

Purtroppo no.
La costante "Null" non è più supportata. Utilizzare "System.DBNull".
System.DBNull e' un tipo di dato.
Avrei potuto fare una cosa tipo:
dim s as string
if Textbox1.text= " " then
  ctype(s,DBNull)
else
  s = Textbox1.text
end IF
Ma il cast da string a DBnull non me lo fa fare. 

 Ma il cast da string a DBnull non me lo fa fare.`
Una soluzione, come già suggerito, è quella di crearsi una funzione a cui 
"dare in pasto" il contenuto dei vari textbox ed ottenere così il valore da 
inserire nella stringa della query, *tenendo presente che per inserire un 
null con una query di insert occorre scrivere letteralmente NULL* mentre i 
valori dei campi di tipo string non nulli andranno racchiusi tra apici.
Es. (scrivo a braccio, non ho testato):
Public Function FormatNullableString(ByVal s As String, Optional ByVal 
Numeric As Boolean) As String
    If s.Trim.Length = 0 Then
        Return "NULL"
    ElseIf Numeric Then
        Return s
    Else
        Return "'" & s & "'"
    End If
End Function
E quindi, tenendo conto che Eta è presumibilmente un campo numerico:
MyQueryString = "INSERT INTO miaTabella(Nome,Cognome,Eta) " _
    & "Values(" & FormatNullableString(TextBox1.Text) _
    &"," & FormatNullableString(TextBox2.Text) _
    &"," FormatNullableString(TextBox3.Text, True) &")"
HTH
Bye
Raf 

 ha scritto nel messaggionews:6736f0F...@mid.individual.net...

scusate, pensavo che Renzo parlasse di vb6 e non .Net.
Ciao

 ha scritto nel messaggio 
news:fecddca9-5d60-495e...@u36g2000prf.googlegroups.com...
Grazie ha tutti, siete stati gentilissimi !!!

 Grazie ha tutti, siete stati gentilissimi !!!
            ^^^^
ops...sorry:) 

 Grazie ha tutti, siete stati gentilissimi !!!
Gia' che ci sei, includi anche nella funzione il controllo sul
raddoppio degli apici cosi' hai grossomodo tutte le casistiche
"classiche" gestite
Toglierei invece il TRIM perche' non e' detto che tu voglia applicarlo
sempre a priori a tutti i tuoi comandi SQL
Public Function FormatNullableString(ByVal s As String, Optional ByVal
Numeric As Boolean) As String
If String.IsNullOrEmpty(s) Then
    Return "NULL"
ElseIf Numeric Then
    Return s
Else
     Return String.Format("'{0}'", s.Replace("'", "''"))
End If
End Function