Risultato di una query nullo

lunedì 17 luglio 2006 - 19.49

bluland Profilo | Guru

salve ho il risultato di una query che spesso potrebbe essere nullo, al verificarsi di tale condizione vorrei catturare l'evento ed imporre particolari condizioni, poiche uso un datareader, vorrei sapere come si fa a catturare l'evento quando il datareader non ha valore?

idee?

saluti
ENzo

alx_81 Profilo | Guru

c'è una funzione, la IsDBNull, che torna true o false..potresti intercettare i valori null all'evento itemdatabound, ovvero al binding di ogni "riga " del datareader, utilizzando questa funzione..
ciao!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

bluland Profilo | Guru


si è quello che sto tentando di fare ma ancora non ci sono riuscito evidentemente sto sbagliando qualcosa nella sintassi.....

EDIT:

ho usato if datareader.isdbnull(0) = true then

........
elseif ......


ho notato che con questa funzione coglie l'evento nel caso in cui il campo il campo del record richiamato nella select sia nullo e non il campo stesso, faccio un esempio per spiegarmi meglio:

ecco la query: "select campo1 from OSM_User where [user] = 'italia' "

la funzione isdbnull funziona se user = italia esiste e coglie l'evento se il campo1 e' nullo

invece, ed è questo il mio caso user= italia non esiste nella tabella non coglie l'evento e mi da il seguente errore:

Invalid attempt to read when no data is present.

dove l'errore punta proprio alla stringa : If dr.IsDBNull(0) = True Then

ho sbagliato qualcosa??

alx_81 Profilo | Guru

Proviamo a fare un po' di ordine..
la FUNZIOE IsDBNull, torna true se il campo passatogli vale null.

If IsDBNull(datareader1("campo1")) Then Response.Write("VALORE NULLO") Else Response.Write("VALORE:" & datareader1("campo1")) End if


Se usi il METODO IsDBNull del datareader (datareader1.IsDBNull(0)), devi passargli l'indice del campo, ma non cambia.

Se quello che ti serve e controllare se un campo in una riga è null, puoi usarle entrambe, viceversa, se vuoi controllare che per una query ci siano risultati basta che usi il metodo Read() per scorrere il datareader. Esso permette di spostare la posizione corrente del puntatore fino ad arrivare alla fine del resultset. Se l'inizio e la fine del set di risultati combaciano, non entra nemmeno nel ciclo. Di conseguenza controlli se vi sono o meno righe di risultato per una query.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra






Alx81 =)

http://blogs.dotnethell.it/suxstellino

bluland Profilo | Guru

ssiiiiiiiii funziona

fare in questo modo , usando getstring era la stessa cosa:
in realtà nella variabile s mi ritorna il ruolo che ha ogni user, cmq funziona grazie ancora.....

Do While dr.Read()
'controllo se ci sono null
If IsDBNull(dr.GetString(0)) Then
'Response.Write("VALORE NULLO")

Else

Dim s As String = dr.GetString(0).Trim

Return s
End If
loop


io usavo la funzione come metodo del datareader cioè datareader1.isdbnull(0) in questo modo cosa andavo a verificare?

alx_81 Profilo | Guru

facevi la stessa cosa.. però senza il do while sul read, presupponevi che il dr fosse pieno, quindi, se il datareader non lo era, non avevi record su cui andare.. In poche parole la READ ti spostava il puntatore sull'end of file..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

bluland Profilo | Guru

grazie tanto ho imparato un altra cosa

sempre in gamba!!!
ma mi consigliasti tu il libro di balena??

alx_81 Profilo | Guru

uno se non sbaglio sì
perchè?
Alx81 =)

http://blogs.dotnethell.it/suxstellino

bluland Profilo | Guru

no era tanto per...
ma perchè uno?? me ne consiglia anche altri?

alx_81 Profilo | Guru

beh.. diciamo che ne ha scritti.. =)
non saprei..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

bluland Profilo | Guru

ERRATA CORRIGE:


stavo provando ancora la soluzione di prima a proposito del datareader, ed ho notato una cosa mentre facevo il debug

Do While dr.Read()
'controllo se ci sono null
If IsDBNull(dr.GetString(0)) Then
Response.Write("VALORE NULLO")

Else
'Response.Write("VALORE:" & dr("so"))

End If
Loop

beh allora se il valore della query ad esempio è nullo quindi non ci sono record nella tabella per il campo1 non mi verifica la prima condizione If IsDBNull(dr.GetString(0)) Then ma dopo Do While dr.Read() salta direttamente fuori dalla funzione, invece se il campo non è nullo mi funziona ed ho il 'Response.Write("VALORE:" & dr("so")).
fatto strano, ma almeno questa volta NON MI VA IN ERRORE e fa esattamente quello che volevo, ma chissà che crepa crea nel codice!!

alx_81 Profilo | Guru

non è strano..

dunque.. ricapitoliamo:

Do While datareader1.read() ... Loop

Ad ogni ciclo fa la read, e quindi si sposta in avanti di un record, se esiste. Se non esiste esce, andando fuori dal ciclo.
Se il datareader è vuoto, quindi, esce subito dal ciclo.. quindi non ti fa tutta la logica che hai messo al suo interno.
Se vuoi gestire anche il controllo dell'esistenza delle righe di un datareader usa:

datareader1.HasRows

che è un valore booleano che ti dice se ci sono una o più righe nel dr.


La sunzione IsDBNull ti torna un booleano che indica se il valore di una colonna, alla riga corrente, è nullo o meno.
Di conseguenza, devi almeno leggere una riga per avere questo controllo, visto che lo hai all'interno del ciclo while..
chiaro?
Alx81 =)

http://blogs.dotnethell.it/suxstellino

bluland Profilo | Guru

chiarissimo, ma allora se è cosi anche se non farà mai il primo if perchè andrà subito fuori dalla logica, cmq mi sembra abbastanza performante....... o no?

alx_81 Profilo | Guru

se guardi msdn, i datareader li scorre così.. =)
quindi.. =) direi di sì =)
Alx81 =)

http://blogs.dotnethell.it/suxstellino
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5