2011-10-28 14 views
9

Sto tentando di aggiungere una colonna a uno esistente DataRow in C#. Successivamente la colonna verrà riempita con un singolo valore dal mio database.ExecuteScalar restituisce null o DBNull (server di sviluppo o produzione)

DataRow dr esiste già e la colonna "COLNAME" esiste anche.
comTBP è il mio SqlCommand.

dr["COLNAME"] = Convert.ToInt32(comTBP.ExecuteScalar()); 

Questo tutto funziona bene se c'è un valore nel mio database e ExecuteScalar() può ottenere quel valore. Se provo questo codice sul mio server di sviluppo (locale) funziona anche se ExecuteScalar() restituisce null o DBNull e il valore della mia nuova colonna è 0. Ma il problema si verifica se distribuisco il mio codice sul server di produzione. Se faccio tutto lo stesso, con lo stesso database getta un'eccezione con un messaggio che non può convertire DBNull in Int32.
La mia domanda è: perché questo errore appare sul server di produzione e non sul mio server di sviluppo locale?

+1

Molto probabilmente diversi dati sulla produzione e lo sviluppo. – leppie

risposta

7

Chiaramente in produzione è disponibile un NULL restituito dall'esecuzione del comando o qualcosa di diverso nel connectiontring o qualsiasi altra cosa; come regola generale si dovrebbe sempre provare per DBNull prima di trasmettere/convertire direttamente in un altro tipo il risultato di ExecuteScalar. risposta

Check Rein qui (e lo votare fino) per la sua bella soluzione suggerita:

Unable to cast object of type 'System.DBNull' to type 'System.String`

+1

'Convert.ToInt32' da' null' restituisce 0. –

+0

Quindi o non dice tutta la verità o hai torto ;-) Ho avuto problemi simili in passato e ho risolto controllando sempre DBNULL prima di convertire/eseguire il casting –

+1

So che restituisce NULL in produzione. Ritorna anche NULL in sviluppo perché è lo stesso DB. La mia domanda era: perché restituisce NULL in sviluppo e ** DBNull ** in produzione? In fase di sviluppo il cast da NULL a Int32 risulterà in 0 ma in produzione tenta di trasmettere da DBNull a Int32 e genera un'eccezione – Yoni

17

ExecuteScalar rendimenti DBNull per valore nullo da query e null per nessun risultato. Forse sul tuo server di sviluppo non si è mai verificato (null risultato da query).

2

Utilizzare la funzione ISNULL() nel proprio SQL.

ISNULL (check_expression, replacement_value)

cioè ...

SELEZIONA ISNULL (SUM (prezzo), 0) dall'ordine