2013-04-05 9 views
7
_callReportCode = reader["Call Report Code"].ToString(); 

Sto tentando di gestire la possibilità per l'oggetto con cui sto chiamando ToString su di essere NULL. Ho intenzione di utilizzare l'affermazione precedente con diverse variabili e non voglio creare un tentativo/cattura individuale per ognuno ... qual è il modo migliore per eseguire il controllo nullo per le stringhe.il modo migliore per prevenire l'errore Null con il lancio di stringhe

Altri tipi di dati Ive che fa questo:

int.TryParse(reader["Account Number"].ToString(), out _accountNumber); 

In questo codice "lettore" si riferisce ad uno SqlDataReader, ma quello non è veramente importante per questa domanda.

+0

http://stackoverflow.com/a/10104842/195488 –

+0

Try/Catch non sarebbe il meccanismo appropriato da utilizzare se si desidera testare singolarmente - si dovrebbe verificare se 'reader ['blah']' è 'Null prima di chiamare '.ToString()'. Le eccezioni dovrebbero _never_ essere parte del normale flusso di esecuzione, sono costose e non progettate per essere utilizzate in questo modo (ad esempio, troppo facile prendere la cosa sbagliata se non si pensa attentamente) – Basic

+1

Non correlato, ma sono curioso a quale numero di conto dovrebbe essere un numero intero. –

risposta

29

Utilizzare la null-coalescing operator: ??

callReportCode = (reader["Call Report Code"] ?? "").ToString(); 

Se i dati nel vostro campo è DBNull.Value (piuttosto che null), questo continuerà a funzionare, in quanto non è DBNull.Valuenull, quindi non sarà utilizzato il ??, e DBNull.Value.ToString() è "", che è ciò che desideri.

+0

+1 per l'operatore a coalescenza nulla. – Clint

+0

Getterà NPE se l'oggetto è nullo –

+0

Non restituire 'DBNull' quando l'oggetto è' Null'? .. – dasblinkenlight

-1

È possibile eseguire un controllo utilizzando String.IsNullOrEmpty() per assicurarsi che non sia nullo, oppure è possibile scrivere un metodo di estensione per eseguire un'azione se non è nullo e un altro/nulla se lo è.

+1

Questo non è un problema –

0

_callReportCode = Convert.ToString (reader ["Call Report Code"]) deve garantire che non vi siano valori nulli.

0

è possibile creare un metodo che si chiama quando si desidera effettuare il controllo. In questo modo si deve digitare il tentativo di cattura solo una volta ... oppure è possibile creare un metodo di estensione per la classe String per fare questo

3

Se la stringa è annullabile, è necessario controllare il valore restituito dal SqlDataReader contro DBNull.Value:

_callReportCode = reader["Call Report Code"] as string; 

Se l'oggetto restituito da reader["Call Report Code"] è non un string, è DBNull.Value, quindi il cast as sta per impostare il valore di _callReportCode a null pure.

Se è necessario impostare la stringa in un non nulla nel caso in cui il valore del database non è presente, aggiungere ??, in questo modo:

_callReportCode = (reader["Call Report Code"] as string) ?? string.Empty; 
0

Uso seguente riga di codice:

_callReportCode = String.IsNullorEmpty(reader["Call Report Code"]) ? 
        String.Empty : 
        reader["Call Report Code"].ToString(); 

invece della seguente riga:

_callReportCode = reader["Call Report Code"].ToString(); 
10
Convert.ToString(reader["Call Report Code"]); 

Restituirà string.Empty se il valore è nullo.

Fonte: http://msdn.microsoft.com/en-us/library/astxcyeh.aspx

Aggiornamento: funziona anche con DBNull, ho appena verificato.

Update 2: ho deciso di portare un test più completo qui, giusto per essere sicuri:

DBNull dbNull = null; 
DBNull dbNullEmpty = DBNull.Value; 
string stringNull = null; 
string stringEmpty = string.Empty; 

var outcome1 = Convert.ToString(dbNull);//Empty string 
var outcome2 = Convert.ToString(dbNullEmpty);//Empty string 
var outcome3 = Convert.ToString(stringNull);//NULL 
var outcome4 = Convert.ToString(stringEmpty);//Empty string 
+0

Ancora lancia un'eccezione quando provo questo ... _callReportCode = Convert.ToString (reader ["Call Report Code"]); il punto è di prenderlo in quella variabile – jth41

+0

@John Puoi condividere i dettagli dell'eccezione? –

+0

non sembra funzionare come dice msdn, può essere controllato da Convert.ToString (null) .EndsWith (""); vs string.empty.EndsWith (""); Lo stmt Convert.ToString (null) .EndsWith ("") genererà un'eccezione di ref di oggetto. – Anil

3

Il mio suggerimento è quello di non trasformare ToString quando i dati non è una stringa, e se la i dati sono già una stringa, quindi chiamare ToString è ridondante e un cast è tutto ciò che è richiesto.

Sto supponendo che il tipo di dati nel database sia intero, nel qual caso è possibile utilizzare un valore nullable int.

int? accountNumber = reader["Account Number"] == DBNull.Value ? null : (int?)reader["Account Number"]; 

Ho fatto un metodo di estensione per fare proprio questa cosa.

public static class SqlDataReaderExtensions 
{ 
    public static T Field<T>(this SqlDataReader reader, string columnName) 
    { 
     object obj = reader[columnName]; 

     if (obj == null) 
     { 
      throw new IndexOutOfRangeException(
       string.Format(
        "reader does not contain column: {0}", 
        columnName 
       ) 
      ); 
     } 

     if (obj is DBNull) 
     { 
      obj = null; 
     } 

     return (T)obj; 
    } 
} 

Uso

int? accountType = reader.Field<int?>("Account Number"); // will return NULL or the account number. 
+0

Cosa fai dopo il valore? come se dovessi passarlo a un costruttore? devo cambiare quel costruttore per prendere un int nullo? – jth41

+0

Dipende dalla tua applicazione, cosa significa per la tua applicazione quando il 'numero di conto' è nullo? – Matthew

1

Il modo più semplice che ho trovato è

_callReportCode = reader["Call Report Code"] + ""; 
+0

Per favore spiega la tua risposta in brevissimo tempo. –

1

ho qualche metodo più semplice e comune.

public static string ToNULLString(this string Values) 
     { 
      if (string.IsNullOrEmpty(Values)) 
      { 
       return ""; 
      } 
      else 
      { 
       return Values.ToString(); 
      } 
     } 

uso in C#

string item = null; 
string value = item.ToNULLString(); 
0

Mi piace usare una combinazione di null-coalescing operator e la null conditional operator:

string nn = MyObject.myNullableVar?.ToString() ?? ""; 

è fondamentalmente lo stesso di questo

string ss = (MyObject.MyNullableVar == null) ? "" : MyObject.MyNullableVar.ToString(); 

bu t più corto.

Problemi correlati