130 messaggi dal 19 maggio 2006
Ciao a tutti,
mi è sorto un nuovo problema, vi spiego meglio...
Quando visito una pagina vorrei che lui mi incrementa il valore presente nel db...ad esempio se il valore di quella pagina era 0 voglio che me lo porti a 1 e avevo messo queste righe di codice per poterlo fare....

SqlCommand ins = new SqlCommand("UPDATE Annunci SET Viste = @Viste WHERE Id = @Id", connection);
SqlParameter parid = new SqlParameter("@Id", SqlDbType.Int);
parid.Value = Request.QueryString["Id"];
ins.Parameters.Add(parid);
int Viste = dr["Viste"];
ins.Parameters.Add("@Viste", SqlDbType.NChar).Value = (Viste + 1);
ins.ExecuteNonQuery();
ins.Connection.Close();

dove dr["Viste"] è il valore che preleva da un'altra connessione ed è un valore di tipo int.
Solo che quando aziono il tutto mi da questo errore CS0266: Impossibile convertire in modo implicito il tipo 'object' in 'int'. È presente una conversione esplicita. Probabilmente manca un cast.

Mi sapete dire dove sbaglio?
130 messaggi dal 19 maggio 2006
scusate ma la stringa:
ins.Parameters.Add("@Viste", SqlDbType.NChar).Value = (Viste + 1);
è stata modificata con
ins.Parameters.Add("@Viste", SqlDbType.Int).Value = (Viste + 1);

e l'errore nuovo è
CS0019: Impossibile applicare l'operatore '+' a operandi di tipo 'object' e 'int'.
dr è un DataReader?

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
Il problema è che dr["Viste"] restituisce un tipo "object" generico che devi castare tu a int con:

int Viste = Convert.ToInt32(dr["Viste"]);


Poi mi viene una riflessione: non so di preciso come funzioni la tua applicazione ma secondo me c'è un errore logico, ovvero rischi di perderti delle visite per problemi di concorrenza. Infatti cosa succede se tra quando leggi il valore (execute che restituisce il datareader) e quando scrivi qualcuno ha sovrascritto il dato?

Soluzioni possibili: o ti implementi uan verifica sulla concorrenza (lock o timestamp o altra tecnica a tuo piacere) oppure - molto più semplice - perché non esegui una query di questo tipo:

SqlCommand ins = new SqlCommand("UPDATE Annunci SET Viste = Viste + 1 WHERE Id = @Id", connection); 


lasciando al database l'onere di conoscere l'ultimo valore?

Ripeto: non so cosa fa la tua applicazione per cui potrei aver scritto una ca.... stroneria

Matteo Casati
GURU4.net
130 messaggi dal 19 maggio 2006
perfetto tutto funzionante

GRAZIE
angelo.recca ha scritto:
perfetto tutto funzionante


Per curiosità: come hai risolto? Con il cast a int o con la query autoincrementale?

Matteo Casati
GURU4.net
130 messaggi dal 19 maggio 2006
con il cast a int... per la query autoincrementante sono funzioni che aggiungo nella 2° versione dell'applicazione, in quanto lo voglio implementare con le stored procedure (che prima devo studiare).

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.