22 messaggi dal 16 ottobre 2014
Buongiorno,
qualche anno fa, ho realizzato un sito (e-commerce) con aspnet 2.0. Per lo stesso, utilizzo un database Access (abbastanza corposo in quanto la sola tabella degli articoli consta di oltre 50.000 voci). Ha sempre funzionato relativamente bene; a livello di carrello, nessun problema nell'imputazione degli ordini nel database, tranne il fatto che, talvolta la numerazione dell'ordine (attribuita randomly) non appariva poi nella pagina del carrello (quando si visualizzava lo stesso). Ora, però, senza che io abbia modificato nulla a questa pagina, compare, richiamandola, spesso e volentieri il seguente messaggio:
System.InvalidCastException: Conversion from type 'DBNull' to type 'Decimal' is not valid
So perfettamente cosa significa e ho verificato che i campi del database interessati non solo assolutamente vuoti, tant'è vero che talvolta l'inserimento di uno stesso articolo va liscio e talvolta invece appunto provoca il suddetto messaggio di errore. Ho fatto numerose verifiche e non sono venuta a capo di nulla.
A questo punto, mi domando se c'è stato qualche aggiornamento nella tecnologia, se questo possa essere provocato dall'accesso da parte di troppi utenti al database Access(so che non è l'ideale come tipo di database per certe esigenze) o, insomma, per quale misteriosa ragione si verifichi questo fastidioso inconveniente che prima non si era mai verificato.
Qualsiasi suggerimento o informazione sarà il benvenuto.
Grazie in anticipo.
Maura
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Maura,
anche se sembra inspiegabile, dobbiamo prendere per vero questo errore perché è tutto quel che abbiamo per risalire alla causa.


System.InvalidCastException: Conversion from type 'DBNull' to type 'Decimal' is not valid


Quindi dobbiamo assumere che quel valore sia effettivamente null. Ovviamente non so dirti perché sia così, ma bisogna cominciare a ragionare sulle situazioni che potrebbero portare a quel problema.

Posta la riga di codice in cui si verifica l'eccezione, può essere d'aiuto.
Posta anche la query che hai inviato al database.

In questo momento, senza avere altri elementi, penso che potrebbe esserci una LEFT JOIN che non trova corrispondenze, e perciò restituisce valori null. Il problema potrebbe essere intermittente se la query non è sempre identica ma, ad esempio, cambiano dei filtri. Oppure potrebbe essere che, mentre la LEFT JOIN viene eseguita, c'è contemporaneamente un comando UPDATE o DELETE che sta alterando i dati.


A questo punto, mi domando se c'è stato qualche aggiornamento nella tecnologia,

Non credo sia questo il problema. Comunque, se gestisci tu il server, assicurati che l'application pool sia ancora impostato sul runtime del .NET Framework 2.0, come vedi in questa immagine.



se questo possa essere provocato dall'accesso da parte di troppi utenti al database Access

Credo di no, casomai avresti problemi di lentezza ma non di corruzione dei dati.
Casomai compatta/ripara il db e vedi se il problema continua a presentarsi.

ciao,
Moreno

Enjoy learning and just keep making
22 messaggi dal 16 ottobre 2014
Caro Brightsoul,
innanzitutto, grazie della prontissima risposta.
Al momento, quello che più mi ha colpito, è quando dici:
"
Non credo sia questo il problema. Comunque, se gestisci tu il server, assicurati che l'application pool sia ancora impostato sul runtime del .NET Framework 2.0, come vedi in questa immagine.
"
In effetti, l'unico cambiamento fatto di recente è proprio l'hosting (e quindi il server) del sito.

Quindi, adesso, in prima istanza, li contatterò, accennerò al problema, e gli spedirò a complemento la preziosa immagine che mi hai mandato, pregandoli di verificare che sia così. Vediamo cosa succede.

Grazie mille intanto.

Maura
22 messaggi dal 16 ottobre 2014
Caro Brightsoul,
seguito mia risposta di prima, purtroppo, ho verificato con il nuovo hosting e l'impostazione application tool concernente la versione del .NET Framework è corretta.

Posto di seguito il codice che mi hai chiesto:
...

Dim Prezzo As String = Request.QueryString("Prezzo")
Dim Incr As Double = Request.QueryString("Incr")
Dim SQLString As String
SQLString = "SELECT ShopCart.OrdineNo, ShopCart.OrdineData, ShopCart.Codice As Codice, Articoli.Nome" & lingua & " as Description, ShopCart.ItemQuantity as Quant, " & _
"Articoli.PrezzoT" & Prezzo & " as Prezzo, Articoli.Incr" & Prezzo & " As Incr, Articoli.Collooriginale As StPck FROM ShopCart, Articoli where ShopCart.Codice = Articoli.Codice " & _
"And OrdineNo = '" & OrdineNo & "' UNION SELECT ShopCart.OrdineNo, ShopCart.OrdineData, ShopCart.Codice As Codice, QdispoSchede1.DescEstesa As Description, ShopCart.ItemQuantity as Quant, " & _
"QdispoSchede1.Prezzo As Prezzo, Articoli.IncrEuroPB As Incr, QtaMinimaOrd As StPck FROM Articoli, ShopCart, QdispoSchede1 where ShopCart.Codice = QdispoSchede1.codice " & _
"And OrdineNo = '" & OrdineNo & "'"

ShopCartSource.SelectCommand = SQLString

Response.Cache.SetCacheability(HttpCacheability.NoCache)
Response.Cache.SetAllowResponseInBrowserHistory(False)

SetFocus("Qty")



End Sub



Dim TotalAmount As Decimal = 0.00

Function Get_Amount(ByVal Prezzo As Decimal, ByVal Quant As Integer, ByVal StPck As Integer, ByVal Incr As Decimal)
Dim Amount As Decimal
Amount = (Prezzo * (Quant - (Quant Mod StPck))) + (Prezzo * (Quant Mod StPck) * (Incr))
TotalAmount += Amount
Return Amount
End Function

Questa è la riga dove si verifica l'errore:
<asp:Label ID="Label9" Runat="Server"
Text='<%# ("¤ ") & (String.Format("{0:N}", _
Get_Amount(Eval("Prezzo"), Eval("Quant"), Eval("StPck"), Eval("Incr")))) %>'/>
</ItemTemplate>

chiamando, per esempio:

http://www.alberti.it/ShopCartR.aspx?OrdineNo=8463549&lingua=IT&prezzo=USD&var=ListAssortimento&incr=1,05

Di seguito, allego parziale della tabella ARTICOLI:
articoli
IdCodiceDescrizionePrezzoDiplPrezzoTotaleContStPckIncrUSD
24230042Aceto di mele1,64 1,64500 ml 61,05
25230052Thè al limone6 6 6x1,5 lt11,05
27230092Bitter lemon14,46 14,4624x33 cl11,05
28230102Ginger ale14,36 14,3624x33 cl11,05
29230122Soda water13,23 13,2324x33 cl11,05
30230182Campari Soda6,73 6,7310x9,8 cl61,05

dove PrezzoDipl è l'etichetta per il campo PrezzoUSD e PrezzoTotale è l'etichetta per il campo PrezzoTUSD

e parziale della tabella ShopCart:

shopcart
IDOrdineNoOrdineDataCodiceItemQuantity
33921276372806/09/2017503718
33922276372806/09/20177136125
33923276372806/09/2017909117
33924276372806/09/20179105196
33925276372806/09/20179109135
33926276372806/09/20179110177

Rimango però dell'idea che siccome l'unico cambio effettuato è stato quello da Aruba al nuovo hosting, in qualche maniera l'inghippo deve essere lì.

Grazie mille in anticipo per la tua preziosa attenzione.
Cordiali saluti.
Maura
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Maura,
ti consiglio di fare questo: scrivi il valore di SQLString in un file di testo, insieme alla data/ora.
Una cosa del genere:
System.IO.File.AppendAllText(Server.MapPath("/public/query.txt"), vbCrLf & DateTime.Now.ToString() & vbTab & SQLString)
'poi assegni la SQLString come facevi prima
ShopCartSource.SelectCommand = SQLString


Quando ti accorgi che la pagina va in errore, collegati via FTP al server e recupera il file di testo. Guarda qual era la query che è stata eseguita in quella data/ora.

Adesso scarica anche il database access sul tuo PC, aprilo e lancia quella stessa query. Ci sono dei null laddove dovrebbero esserci dei decimal?

Secondo me, soprattutto se non hai usato vincoli di foreign key tra le tabelle shopcart e articoli possono verificarsi situazioni in cui alcune righe restano "orfane", cioè senza nessun corrispondente nell'altra tabella.

Fammi sapere,
ciao.

Moreno

Enjoy learning and just keep making
Scusate se mi intrometto, sicura che il problema non sia
Dim Incr As Double = Request.QueryString("Incr")

magari in dipendenza anche di una culture non corretta?

L'errore comunque deriva da un campo che tu hai previsto decimal ma null sul db.
Modificato da manuel0081 il 15 settembre 2017 12.56 -

Ormai programmano tutti... ma la professionalità appartiene a pochi
22 messaggi dal 16 ottobre 2014
Ciao Moreno,
ascolta, io ho fatto come mi hai spiegato, ovvero salvato in un file di testo (query.txt):

"
System.IO.File.AppendAllText(Server.MapPath("/public/query.txt"), vbCrLf & DateTime.Now.ToString() & vbTab & SQLString)
Dim Prezzo As String = Request.QueryString("Prezzo")
Dim Incr As Double = Request.QueryString("Incr")
Dim SQLString As String
SQLString = "SELECT ShopCart.OrdineNo, ShopCart.OrdineData, ShopCart.Codice As Codice, Articoli.Nome" & lingua & " as Description, ShopCart.ItemQuantity as Quant, " & _
"Articoli.PrezzoT" & Prezzo & " as Prezzo, Articoli.Incr" & Prezzo & " As Incr, Articoli.Collooriginale As StPck FROM ShopCart, Articoli where ShopCart.Codice = Articoli.Codice " & _
"And OrdineNo = '" & OrdineNo & "' UNION SELECT ShopCart.OrdineNo, ShopCart.OrdineData, ShopCart.Codice As Codice, QdispoSchede1.DescEstesa As Description, ShopCart.ItemQuantity as Quant, " & _
"QdispoSchede1.Prezzo As Prezzo, Articoli.IncrEuroPB As Incr, QtaMinimaOrd As StPck FROM Articoli, ShopCart, QdispoSchede1 where ShopCart.Codice = QdispoSchede1.codice " & _
"And OrdineNo = '" & OrdineNo & "'"

ShopCartSource.SelectCommand = SQLString
"

Ma non ho capito cosa devo fare di questo file di testo e dove caricarlo.
Ho provato a salvarlo come query.txt, creare una cartella public sul server, salvarlo là, poi recuperarlo al primo errore, ma era sempre uguale.

Sicuramente, salto un passaggio, scusami per il disturbo.
Potresti spiegarmi meglio?
Grazie mille.
Maura
Articoli.PrezzoTUSD o Articoli.IncrUSD o QdispoSchede1.Prezzo o Articoli.IncrEuroPB è nullo.

Non vedo il campo Articoli.IncrEuroPB nella tabella che hai postato.
Modificato da manuel0081 il 15 settembre 2017 12.24 -

Ormai programmano tutti... ma la professionalità appartiene a pochi

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.