Newsgroup: it.comp.lang.visual-basic
Titolo: OLEDBcommand e collezione Parameters: valore nullo!...ehm ...in c#

è in C# scusate....
Spiegatemi:
si parte da una query che deve avere dei parametri....
una dichiarazione
 cmd.Parameters.Add("@3", OleDbType.Char).Value=
utente.cf
;
funziona? certo che funziona!
Solo che non è blindata per i valori nulli!
in c# mi accetta (ci mancherebbe non c'entra nulla il linguaggio)
cmd.Parameters.Add("@2", OleDbType.Char).Value= DBNull.Value  ;
quello che non mi riesce è scrivere una versione compatta in c# di iif
perchè
cmd.Parameters.Add("@1", OleDbType.Char).Value=(utente.nome == null)?
DBNull.Value : utente.nome ;
Mi dà errore
Impossibile determinare il tipo di espressione condizionale perchè non
esiste conversione implicita tra system.dbnull e system string
mi scoccia scrivere (Va quanta roba in più da immettere per N
volte!...molte N volte!):
if (utente.nome==null)
{
cmd.Parameters.Add("@1", OleDbType.Char).Value=DBnull.Value;
 }
else
{
cmd.Parameters.Add("@1", OleDbType.Char).Value=utente.nome;
}
Help!...me stà a massacrà sto c#!!!
Grazie!

 esiste conversione implicita tra system.dbnull e system string
così va
cmd.Parameters.Add("@1", OleDbType.Char).Value= ((utente.nome ==
null) ? "" : utente.nome );
ma mi crea ancor più confusione!
cmd.Parameters.Add("@1", OleDbType.Char).Value=DBNull.value viene
accettato!
Quindi è nell'operatore ternario che DBNull viene provato a castare a
string e fallisce?...e perchè?
(grrrr......VB.net se possibile tutta la vita!...ma come vi fà a
piacere sta ciofeca di linguaggio!!!!)

 ha scritto:


Guarda dal punto di vista della sicurezza dei tipi VB in questo caso ne
esce "sconfitto" dato che il tuo bel IIF ritorna un object generico, cosa
che non fa il caro operatore ternario del C# :) e credimi è cosa buona.
Se proprio vuoi bypassare devi fare in modo che i tipi siano compatibili.
Per questo puoi usare .ToString() sui due oggetti. Anche perchè poi viene
castata automaticamente al tipo corretto quando il valore scelto entra nel
parametro.


abbi pazienza loganino ...risposta insufficiente!
  cmd.Parameters.Add("@1", OleDbType.Date).Value = (utente.nome ==
null) ? DBNull.Value.ToString()  : utente.nome);
funziona!
Ma perchè?Come mai??? è questo che non capisco!
 cmd.Parameters.Add("@1", OleDbType.Date).Value =DBNull.Value
funziona ed invece nell'operatore ternario no?
l'op.ternario accetta solo stringhe? no!da quanto leggo sulla
documentazione no!
E' Parameters che accetta solo stringhe? NO!...al limite  trasforma il
valore in una stringa quando costruisce la query sql!
L'importante non è solo risolvere...ma anche capire cosa sbaglio!
ed io
  cmd.Parameters.Add("@1", OleDbType.Date).Value = (utente.nome ==
null) ? DBNull.Value.ToString()  : utente.nome);
accetto che funzioni...ma non capisco perchè!

 esiste conversione implicita tra system.dbnull e system string
C# è molto più fighetta e spaccamaroni, io dico fortunatamente ma 
capisco che ogni tanto sia un po' troppo rigidello :-)
prova così:
cmd.Parameters.Add("@1", OleDbType.Char).Value=(utente.nome == null)?
( Object )DBNull.Value : ( Object )utente.nome;
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

 
Perchè ?: è appunto un operatore che restituisce il valore di un BEN
determinato tipo. Grosso modo (permettimi la comparazione non propriamente
etica) guardala come una funzione...che può restituire UN solo tipo. A meno
che il valore ritornato dalla funzione non sia IMPLICITAMENTE convertibile nel
tipo restituito dalla funzione, ti sarà generato un errore.
Praticamente se ho:
 condizione ? val1 : val2;
Devi essere sicuro che il TIPO di val1 ed il TIPO di val2 siano implicitamente
convertibili l'uno nell'altra. (Ed è per questo che con le stringhe ti
funziona....claro, sono entrambi tipi stringa :D).
Come puoi ben vedere non funziona SOLO con le stringhe ma con tutti i tipi
implicitamente convertibili l'uno nell'altra.
Che significa implicitamente convertibile? 
Esempio:
   byte var1 = 32;
   int var2 = var1;
Il valore di var1 viene convertito implicitamente ad int e poi assegnato a
var2 che è appunto di tipo intero.
Non so se sono stato chiaro :D Se hai domande chiedi pure.


così funziona....
grazie...i miei polpastrelli ringraziano sentitamente!
grazie anche a Loganino!