2009-03-06 12 views
6

Ci sono state domande simili ma le risposte non erano quello che stavo cercando. Voglio inserire il valore di NULL nel database di SQL Server se il riferimento è NULL o un valore non è stato ancora assegnato. Al momento sto testando per nulla e sembra che.Net inserendo valori NULL nel database SQL Server da valori variabili

String testString = null; 

if (testString == null) 
{ 
    command.Parameters.AddParameter(new SqlParameter("@column", DBNull.Value); 
} 
else 
{ 
    command.Parameters.AddParameter(new SqlParameter("@column", testString); 
} 

Questo guarda e si sente incredibilmente maldestro di me. Ho alcuni valori che sto inserendo in un database e per testarli tutti come sopra è molto prolisso. .Net non gestisce questo in qualche modo. Ho pensato che forse avrei usato una stringa piuttosto che una stringa, ma anche questo non sembra funzionare. Guardandomi intorno ho trovato articoli che parlano dell'uso dei tipi di Nullable.

System.Nullable<T> variable 

Questo sembra funzionare per i primitivi, int ?, char? Doppio? e bool ?. In modo che potrebbe funzionare per quelli, ma per quanto riguarda le stringhe? Mi sto perdendo qualcosa qui. Quali tipi dovrei utilizzare per i valori primitivi e per i valori di stringa in modo che non debba verificare ripetutamente i valori prima di inserirli.

MODIFICA: Prima di ottenere troppe risposte sugli operatori ternari. Mi piacciono ma non in questo contesto. Non ha senso per me aver bisogno di testare quel valore e avere tutta quella logica in più, quando quel genere di cose avrebbe potuto essere implementato più in basso nel framework .Net e se avessi saputo quali tipi dare, lo otterrebbe gratuito.

Modifica: Ok, quindi ragazzi aiutatemi a formulare il mio piano di attacco. Userò il Nullable per i miei primitivi (int ?, double? Ecc.) E per le mie stringhe userò lo String ma il ?? test. Ciò mantiene le cose meno dettagliate. C'è qualcosa che mi manca qui, come forse perdere qualche semantica?

risposta

11

Ancora meglio del ternario è l'operatore di doppia domanda (??). Accetta il primo valore non nullo.Quindi:

string x = null; 
command.Parameters.AddParameter(
    new SqlParameter("@column", (object)x ?? DBNull.Value); 

darebbe una parm con un valore di DBNull.Value, ma

string x = "A String"; 
command.Parameters.AddParameter(
    new SqlParameter("@column", (object)x ?? DBNull.Value); 

darebbe una parm con "A String" come valore.

+1

Il compilatore si strozzerà perché non può convertire implicitamente da stringa a DBNull. – LukeH

+0

Sei corretto. Devi abbattere la stringa (x) in un oggetto. Esempio modificato –

+0

Non è un fan di questo, perché rende facile a .Net indovinare il tipo sbagliato per un parametro. Sarebbe meglio specificare il tipo di parametro tramite un overload che richiede un enum 'SqlDbType'. –

0

Forse l'operatore ternario è qualcosa che trovi utile.

0

Quello che a volte faccio, è questa:

command.Parameters.Add ("@column", SqlDbType.VarChar).Value = DBNull.Value; 

if(String.IsNullOrEmpty (theString) == false) 
{ 
    command.Parameters["@column"].Value = theString; 
} 
3

Nullable grandi opere per le primitive. Dovrò testare il comportamento della stringa, ma una opzione per pulire almeno il codice sarebbe definire un metodo di estensione della stringa.

È possibile utilizzare il ?? operatore per le stringhe:

command.Parameters.AddParameter (nuovo SqlParameter ("@ colonna", myNull ?? (oggetto) DBNull.Value);

?? restituisce il primo elemento se non è nullo, altro saggio restituisce la seconda voce.

Modifica

Risolto il codice di cui sopra in modo che la compilazione è necessario lanciare DBNull.Value a un oggetto.

+0

Il compilatore si strozzerà perché non può convertire implicitamente da stringa a DBNull. – LukeH

+0

Credo che tu possa usare testString ?? (stringa) DBNull.Value. –

+0

Cosa ne pensi di ((oggetto) testString) ?? DBNull.Vale – recursive

0

sono d'accordo che si tratta di goffo e un po 'un peccato che SqlParameter.Value deve essere impostato su DbNull.Value. Ma ther Non c'è modo di aggirarlo, quindi devi convivere con il test per null.

0

Nullable<T> non può essere applicato a String poiché è un tipo di riferimento e non un tipo di valore.

+0

Ciao. Ho appena guardato, è deludente che la stringa al contrario di String sia ancora un tipo di riferimento. Apparentemente si tratta di un alias ma, ad esempio, stringa a = "ciao"; stringa b = "h"; b + = "ello"; quindi a == b restituisce true perché confronta i loro valori. Interessante. – uriDium

+0

Sì e No - C'è una buona ragione per cui la stringa è un tipo di riferimento e non un tipo di valore (guarda alcune delle cose di Jon Skeet che è un professionista in quell'area); Per i casi che hai specificato è per questo che hanno creato la classe StringBuilder. –

0

Esempio:

if (txtDisplayName.Text != "") 
{ 
    insert into table (id,display_name) values ('" + txtID.Text + "','" + txtDisplayName.Text + "'); 
} 
else 
{ 
    insert into table (id) values ('" + txtID.Text + "'); 
} 

Questo inserirà null.

+0

Ciao, benvenuto su Stack Overflow! Questo è uno snippet di codice incompleto. – Jesse