17 messaggi dal 24 giugno 2002
Ciao a tutti.
Ho installato visual studio 2008 al posto del 2005.
Tutto bene.
Ora il mio applicativo ASP.NET denuncia uno strano inghippo.
Vi chiedo di riprodurlo su VS2005 per capire se sono impazzito io o lui...

Vi chiedo di fare una prova, seguendola in debug.
definite un sqlcommand senza istruzione( tanto non la eseguite)
ed aggiungete il parametro qualsiasi.
e mettete un breakpoint all'istruzione pippo.

myCommand = New SqlCommand("", myConnection)
myCommand.Parameters.Add(New SqlParameter("@valuta", SqlDbType.Money)).Value = DBNull.Value
dim pippo as integer = 1

nella immediate window di debug:
?mycommand.Parameters(0)
risultato
{System.Data.SqlClient.SqlParameter}
CompareInfo: None {0}
DbType: Currency {4}
Direction: Input {1}
IsNullable: False
LocaleId: 0
Offset: 0
ParameterName: "@valuta"
Precision: 0
Scale: 0
Size: 0
SourceColumn: ""
SourceColumnNullMapping: False
SourceVersion: Current {512}
SqlDbType: Money {9} <-------
SqlValue: {System.Data.SqlTypes.SqlMoney}
TypeName: ""
UdtTypeName: ""
Value: {System.DBNull}
XmlSchemaCollectionDatabase: ""
XmlSchemaCollectionName: ""
XmlSchemaCollectionOwningSchema: ""


vediamo che SQLDBtype = 9 , perfetto!!!

ora cambiamo il codice in questo modo:

Dim papero As Integer = 9
myCommand.Parameters.Add(New SqlParameter("@valuta", papero)).Value = DBNull.Value

rifacciamo debug e vediamo:


?mycommand.Parameters(0)
{System.Data.SqlClient.SqlParameter}
CompareInfo: None {0}
DbType: String {16}
Direction: Input {1}
IsNullable: False
LocaleId: 0
Offset: 0
ParameterName: "@valuta"
Precision: 0
Scale: 0
Size: 0
SourceColumn: ""
SourceColumnNullMapping: False
SourceVersion: Current {512}
SqlDbType: NVarChar {12} <------ !!!!!!
SqlValue: {System.Data.SqlTypes.SqlString}
TypeName: ""
UdtTypeName: ""
Value: {System.DBNull}
XmlSchemaCollectionDatabase: ""
XmlSchemaCollectionName: ""
XmlSchemaCollectionOwningSchema: ""


SQLDBtype non è Money, ma NVarChar

Conseguenza poi tutto va in tilt.

Io sono convinto che su VS2005 framework 2,0 non succedeva.
Mi potete dare conferma?
Grazie!
Bruno.

Bruno60
Se trovi una persona nel forum che è disposta a farti questa prova ti pago un caffè
Nel caso accada, quando passi per milano fammi un fischio.

Ciauz

imperugo
Microsoft MVP
myblog : http://www.tostring.it
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
Non so se con la 2005 non funzionava, ma il problema sta nel passaggo del tipo di oggetto nel costruttore della classe SqlCommand.

Se guardi la lista dei costruttori:
http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.sqlparameter.aspx
Vedrai:

SqlParameter(string, SqlDbType)
e
SqlParameter(string, object)

Nel tuo primo caso:
New SqlParameter("@valuta", SqlDbType.Money)

Passando i "tipi" esatti di oggetti, il framework non ha dubbi: richiama il primo costruttore. Ma nel tuo secondo esempio:

Dim papero As Integer = 9
New SqlParameter("@valuta",papero)

Non essendoci un costruttore adatto a ricevere un intero come parametro, usa quello generico, il secondo, che, come dice la documentazione: http://msdn2.microsoft.com/en-us/library/0881fz2y.aspx

"Initializes a new instance of the SqlParameter class that uses the parameter name and a value of the new SqlParameter."

Il "9" viene utilizzato come value per quel parametro (se vuoi provare a fare debug togliendo l'assegnazione con la proprietà "value").
Ciao
213 messaggi dal 25 settembre 2006
ma cosa vuoi ottenere passando l'integer nel secondo caso?
se 9 deve essere il valore allora imposta il tipo su Money come fai la prima volta e successivamente assegna il valore 9.

se invece per '9' intendi il tipo money allora puoi fare un cast in questo modo ((SqlDbType)9) in quanto SqlDbType è una enumerazione. Comunque ti sconsiglio di fare così, dovresti utilizzare l'enumerazione SqlDbType.Money

Ciao.
Modificato da gyppo il 26 febbraio 2008 12.59 -
Modificato da gyppo il 26 febbraio 2008 13.10 -
17 messaggi dal 24 giugno 2002
Ciao Andrea,
ho studiato il link, ma non l'ho capito.
Ho provato a fare:
myCommand.Parameters.Add(New SqlParameter("@valuta", Convert.ToInt32(pippo))).Value = DBNull.Value
ma non cambia nulla.
Eppure Convert.ToInt32(pippo) ora è chiaramente un int, esattamente come SqlDbType.Money e non capisco perchè il compilatore si confonde...
(se li seguo con il debug entrambi sembrano uguali, eppure si comporta in modo diverso).

Ho comunque risolto in modo che non mi piace, aggiungendo una istruzione dopo:
mycommand.Parameters("@valuta").SqlDbType = ws_sqldbtype
Questa "rimette" a posto il parameter e poi sql funziona.
Bruno.

Bruno60
17 messaggi dal 24 giugno 2002
Ciao gyppo,
la mia function riceve un parametro che indica il tipo di campo sql e ritorna un parameter configurato dinamicamente.
Per questo non posso usare l'enumeratore SqlDbType.Money diretto, a meno di fare un select case di tutte le possibilità.
Ho provato a usare il tuo suggerimento
un cast in questo modo ((SqlDbType)9)
ma il compilatore non lo accetta.
Bruno.

Bruno60
213 messaggi dal 25 settembre 2006
scusami quel cast è valido in c# e non in vb
prova così
CType(9, SqlDbType)


una domanda, ma come recuperi il valore 9? lo imposti tu sapendo che corrisponde a Money?
17 messaggi dal 24 giugno 2002
Ciao Gyppo,
Perfetto!!!
scrivendo

pippo = 9
myCommand.Parameters.Add(New SqlParameter("@valuta", CType(pippo, SqlDbType))).Value = DBNull.Value

in fase di esecuzione ottengo un sqldbtype = money.

Per rispondere alla tua domanda, si, ho una function generica che carica in una variabile di tipo int il tipo sql relativo al campo ed un'altra funzione che invece genera il sqlparameter in modo dinamico.
Bruno60.

Bruno60

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.