Problema con executeScalar che restituisce un valore NUll

domenica 28 febbraio 2010 - 07.16

ridaria Profilo | Expert

Ciao amici.

Mi sono imbattuto in questo problema:

Esegue delle query di inserimento ed aggiornamento dati, utilizzando il costrutto sql "IF EXISTS (....) update ........."
utilizzo executeScalar per prelevare l'id del record appena aggiunto, popolando una variabile di tipo integer con il valore restituito da executeScalar.

Che cosa accade:
1) se il record non esisteva tutto fila liscio avviene l'inserimento e la mia variabile "idRec" record viene mestamente popolata:
idRec= m_cmd.ExecuteScalar()

2)Sorpresona! Se il record esiste, il set di risultati è chiaramente vuoto, e quindi, giustamente executeScalar restituisce "null".

Quale è la strada migliore tra le seguenti:

1)idRec as string, così se executScalar è null idRec sarà stringa vuota;
idRec = m_cmd.ExecuteScalar().ToString

2)idRec as Object così la mia variabile "squillo" prende qualunque cosa arrivi.
Dim idRec As Object = Nothing
idRec = m_cmd.ExecuteScalar()

Grazie a tutti















Riccardo D'Aria

tonyexpo Profilo | Senior Member

ciao
puoi fare così:

1:

dim risp as object = mycm.ExecuteScalar()
if risp isnot DBNull.Value Then OK else E' NULL

2:

dim i as Nullable(of integer) = mycm.ExecuteScalar()
if i.HasValue then E' OK else E' null


Antonio Esposito
MCTS, MCP

http://blogs.dotnethell.it/espositos

mauronet Profilo | Newbie

Ciao Antonio.

Ho letto una tua risposta e mi sembri molto preparato su ExecuteScalar() e VB.
Ti vorrei chiedere quindi la cortesia di aiutarmi in questo codice perchè ci sto impazzendo. Devo rilevare da un db Access un valore che in Access è 'Intero lungo'. L'ExecuteScalar MI DA ERRORE DI TIPI NON CORRISPONDENTI.

Ho scritto questo codice:

DIM codice as String '**** ma anche se gli do Integer o Long mi da lo stesso errore

'apro la connessione
connessione = New OleDbConnection(stringaDiConnessione)
connessione.Open()

'definisco il comando Select per verifica articolo già esistente (non è consentito)
comandoSQL = New OleDbCommand("SELECT IDCodiceArt FROM ArticoliAnagrafica Where IDCodiceArt = '" & codice & "' ", connessione)

'verifico esistenza
If CType(comandoSQL.ExecuteScalar, String) = codice Then '******** QUI MI DA ERRORE DI TIPI NON CORRISPONDENTI *********
MsgBox("Occhio! Esiste già l'articolo: " & codice & " " & descrizione)
End If

*** Cosa sto sbagliando?

Grazie mille in anticipo e auguri per tutto.
Mauro.

ridaria Profilo | Expert

>Ciao Antonio.
>
>Ho letto una tua risposta e mi sembri molto preparato su ExecuteScalar()
>e VB.
>Ti vorrei chiedere quindi la cortesia di aiutarmi in questo codice
>perchè ci sto impazzendo. Devo rilevare da un db Access un valore
>che in Access è 'Intero lungo'. L'ExecuteScalar MI DA ERRORE
>DI TIPI NON CORRISPONDENTI.
>
>Ho scritto questo codice:
>
>DIM codice as String '**** ma anche se gli do Integer o Long
>mi da lo stesso errore
>
> 'apro la connessione
>connessione = New OleDbConnection(stringaDiConnessione)
> connessione.Open()
>
>'definisco il comando Select per verifica articolo già esistente
>(non è consentito)
>comandoSQL = New OleDbCommand("SELECT IDCodiceArt FROM ArticoliAnagrafica
>Where IDCodiceArt = '" & codice & "' ", connessione)

il primo errore lo commetti qui sopra
se IdCodiceArt è di tipo Intero Lungo, non puoi dirgli di confrontarlo con un valore di tipo stringa, ed il valore di tipo stringa no è dato dal tipo della variabile codice, ma dal fatto che tu la chiudi tra le apici:
' " & codice & " ' "

Comincia a sistemare questo.




>*** Cosa sto sbagliando?
Ciao Riccardo
Riccardo D'Aria

mauronet Profilo | Newbie

Ciao Riccardo!

ti ringrazio infinitamente per l'interessamento.
Mi hai dato un indizio che mi ha aiutato, ma ho dovuto risolvere con un 'pre-commando' per formattare la stringa SELECT affinchè piacesse di più a ExecuteScalar.
Ho fatto così:

'dichiarazione formato LONG della variabile **********
Dim codice As Long

'apro la connessione
connessione = New OleDbConnection(stringaDiConnessione)
connessione.Open()

'definisco parte del comando ****** ho dovuto fare questo, ORA FUNZIONA! *******
Dim mycmd As String = "SELECT IDCodiceArt FROM ArticoliAnagrafica Where IDCodiceArt ="

'definisco il comando Select per verifica articolo già esistente (non è consentito)
comandoSQL = New OleDbCommand(mycmd & codice, connessione)

'verifico esistenza
If CType(comandoSQL.ExecuteScalar, String) = codice Then
MsgBox("Occhio! Esiste già l'articolo: " & codice & " " & descrizione)
End If

FUNZIONA!!!

Ti ringrazio e a presto.
Mauro.

ridaria Profilo | Expert

se ti sono stato di aiuti chiudi il post flaggando la mia rsposta come accettata


ciao e grazie

Riccardo D'Aria
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5