Tipi di dati Sql problema con query VB2010

giovedì 27 settembre 2012 - 09.09
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows 7  |  Visual Studio 2010  |  SQL Server Express

alsa Profilo | Junior Member

Salve ragazzi,
dato che è da poco che sto lavorando con Sql (nello specifico la versione compact 3.5), non ho ancora capito bene quando utilizzare un tipo di dato piuttosto che un altro, vi spiego il mio problema.
Ho un listino tariffe per dei servizi postali, il listino ha questi campi: Hn(NVARCHAR - che identifica se è Hinterland, In Provincia o Nazionale), Min(NUMERIC - dove inserisco un peso minimo che può essere anche un numero con virgola), Max(NUMERIC - dove inserisco un peso massimo che può essere anche un numero con virgola), Prezzo(MONEY - ovviamente il prezzo di quella spedizione), Tipo(NVARCHAR - Il tipo di servizio, Raccomandata, posta semplice ecc...)
Nel mio programma ho la variabile peso di tipo double e ho impostato questa query nel momento in cui si conclude la configurazione della spedizione:

"SELECT Prezzo FROM Tariffe WHERE Hn = 'H' AND Tipo = 'P' AND Min < " & peso & " AND Max > " & peso

Purtroppo però non mi legge nulla.
Sono sicuro che c'è qualche errore, data la mia scarsissima esperienza ma cercando in giro non ho trovato l' illuminazione.
C'è qualcuno che mi può aiutare a capirci di più?

Grazie!

DomA Profilo | Expert

Ciao,
non sono un esperto di db, ma credo che impostando così la query è possibile che non venga restituito alcun dato perché non ci sono record che la soddisfano.
In particolare per quanto rigurda il peso. Vuoi forse trovare tutti i record il cui peso sia compreso tra il peso min ed il peso max?
Se è così allora prova ad impostarla in questo modo:
"SELECT Prezzo FROM Tariffe WHERE Hn = 'H' AND Tipo = 'P' AND peso between Min AND Max "

Fammi sapere.


Ricorda che, accettare la risposta è un modo di ringraziare chi ci ha aiutato ed evidenziare che il problema è stato risolto.

http://www.infomidia.it

Domenico

alsa Profilo | Junior Member

Ti ringrazio Doma, ho provato immediatamente ma mi restituisce questa eccezione:

Nome di colonna non valido. [ Node name (if any) = ,Column name = peso ]

praticamente cerca la colonna Peso.

boccia75 Profilo | Junior Member

Prova a cambiare i nomi delle colonne.
Min e Max sono nomi "riservati" per sql.
In alternativa metti Min e Max tra doppi apicetti ("Min" e "Max")
Ciao.
PS
Ma esistono record che soddisfano la query?

DomA Profilo | Expert

Ciao,
boccia75 potrebbe aver ragione in questo caso metterei i nomi dei campi tra parentesi quadre [Min], [Max].
>>Tuttavia data l'eccezione direi che il problema sta nel fatto che non esiste un capo peso. In questo caso prova così:

"SELECT Prezzo FROM Tariffe WHERE [Hn] = 'H' AND [Tipo] = 'P' AND [Min] < " & peso & " OR [Max] > " & peso

Nota l'operatore OR. potresti anche mettere: "...[Min]<= " & peso & " OR [Max]=> " & peso

Ma il peso non dovrebbe essere => al Min e <=Max?

Se è così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra



Ricorda che, accettare la risposta è un modo di ringraziare chi ci ha aiutato ed evidenziare che il problema è stato risolto.

http://www.infomidia.it

Domenico

alsa Profilo | Junior Member

Ragazzi scusate, dato che ho fatto un pò di confusione cambiando e ricambiando il tipo delle colonne Min e Max, vi dispiacerebbe ricominciare dall' inizio?
Cioè, quale tipo di dato devo assegnare alle colonne per far si che accettino valori con virgola e per non aver problemi nel confronto con la variabile peso che è Double?

DomA Profilo | Expert

Utilizza Float.
Cmq guarda qui: http://www.html.it/pag/31831/i-tipi-di-dati-in-sql-server/


Ricorda che, accettare la risposta è un modo di ringraziare chi ci ha aiutato ed evidenziare che il problema è stato risolto.

http://www.infomidia.it

Domenico

alsa Profilo | Junior Member

Grazie Doma, ho cambiato il tipo in float e la query adesso funziona includendo i nomi delle colonne nelle parentesti:

"SELECT Prezzo FROM Tariffe WHERE Hn = 'H' AND Tipo = 'S' AND [Min] < " & peso & " AND [Max] > " & peso

Però inserendo una nuova riga, tramite il server explorer e assegnando un valore con la virgola alla colonna Min (es. 3,1) mi restituisce questo messaggio :

Invalide Valure for Cell.
The changed value in this cell was not recognized as valid.
.NET Framework data type: Int64
Error Message: Input string was not in a correct format.

Spero non sia un problema nella precisione del campo perchè non mi permette di cambiare quell' impostazione.

DomA Profilo | Expert

utilizz il punto invece della virgola (dovrebbe funzionare).
Ricorda che, accettare la risposta è un modo di ringraziare chi ci ha aiutato ed evidenziare che il problema è stato risolto.

http://www.infomidia.it

Domenico

alsa Profilo | Junior Member

Niente, non va neanche con il punto, penso che cancellerò e ricreerò questa tabella dato che sembra nata male.
Intanto grazie mille per l' aiuto e, se posso, vi chiedo un altra delucidazione, in un altra tabella ho un campo che è di tipo Money dove, se con una query inserisco un valore con virgola (es 12,44), quando vado a verificare, il valore inserito risulta essere 1244,00000, com'è possibile? dov'è l' errore?

Grazie ancora

DomA Profilo | Expert

Guarda qui:
http://msdn.microsoft.com/it-it/library/ms187912(v=SQL.90).aspx

c'è da studiare un po'.


Ricorda che, accettare la risposta è un modo di ringraziare chi ci ha aiutato ed evidenziare che il problema è stato risolto.

http://www.infomidia.it

Domenico

alsa Profilo | Junior Member

Ti ringrazio infinitamente Doma,
effettivamente ho dovuto studiare un pochino ma mi hai indirizzato molto bene devo dire.
Non mi fa impazzire Sql come gestisce tipi di dati decimali ma, tant'è, questo passa il convento.
Comunque per i postumi ho risolto il problema del tipo Money parametrizzando la query per l' inserimento, e, al primo colpo, ha funzionato.

Grazie ancora!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5