Newsgroup: it.comp.lang.visual-basic
Titolo: Problema con Oracle e Vb

Ho un problema sul prelevamento di dati da una tabella Oracle con Visual
Basic.
La tabella che ho creato in Oracle è di quasto tipo:
nome tabella:  T_DATI
Dati        :  XCoord Number(12,8)
XCoord Number(12,8)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Ho un problema sul prelevamento di dati da una tabella Oracle con Visual
Basic.
La tabella che ho creato in Oracle è di quasto tipo:
nome tabella:  T_DATI
Dati        :  XCoord Number(12,8)
               YCoord Number(12,8)
Inserisco i dati nella tabella facendo:
INSERT INTO T_DATI(XCoord,YCoord) VALUES ('12,123','45,521')
Il problema che ho è che quando vado a prelevare i dati da VisualBasic mi
restituisce solo la parte intera del Dato e non i decimali!
Dim X as Variant
set rs = conn.Execute("Select * from T_DATI")
X = rs!XCoord    ' Mi restituisce 12 e non 12,123
Sapete darmi un consiglio?
Grazie Simone



La cosa più strana che ho visto nel tuo codice è l'insert con gli apicini.
In SQL non servono, e si usa il punto come separatore. Penso anche in
Oracle.
Ciao
Alberto

Grazie Alberto,
Comunque ho utilizzato la INSERT con gli apici perchè credevo che magari
,mettendo il punto invece della virgola, fosse quello il mio errore.
Facendo una SELECT mi visualizza il dato correttamente con tutti i
decimali.
Ho notato una cosa, che se dichiaro il campo di tipo NUMBER senza
specificargli la precisione (che sarebbe la parte tra parentesi) mi
funziona tutto correttamente! Ma purtroppo io non posso modificare quel
campo..quindi la devo risolvere in qualche modo.
Ciao


 campo..quindi la devo risolvere in qualche modo.
Allora il problema potrebbe essere nel tipo ritornato dal value del campo.
Verifica cosa ti viene restituito da rs!XCoord.TYPE, e confrontalo con le
varie costanti AD<type>.
Prova anche a dimensionare X come Double anzichè Variant
Ciao
Alberto
PS: il tipo variant viene convertito in object passando a .NET
Io l'ho rimosso definitivamente da tutte le mie procedure, sperando di
guadagnare qualcosa in compatibilità futura...

 guadagnare qualcosa in compatibilità futura...
E come fai per i campi di database che potrebbero essere a Null (valore
gestito soltanto da variant e ben diverso da 0 o da stringa vuota)?
ciao
Alfonso

 ha scritto nel messaggio
news:a3u7re$1adcc8$1...@ID-89238.news.dfncis.de...

E' buona norma di programmazione effettuare sempre un controllo sui valori
NULL, ed assegnare un valore di default (quando questo è consentito).
Potendo progettare io il DB, è mia precisa scelta quella di non consentire
mai campi NULL, ma quando devo intervenire su DB di altri, mi comporto in
modo diverso a seconda che il valore del campo sia Null o meno.
Comunque, il fatto di non usare Variant è specificato anche chiaramente nel
sito comune, che fa appunto menzione di alcuni rari casi particolari.
Ovviamente, ognuno è libero di programmare come vuole. Considera però che
io, pur lavorando pesantemente con i database di diverso genere, riesco
sempre a gestire tutto, pur non utilizzando variant.
Comunque, il tipo Variant è ufficialmente morto, visto che non sarà
mantenuto nè in Vb.Net, nè in C#. Io, personalmente, sono riuscito ad
abolirlo, programmando opportunamente, e questo, oltre ad una forte
tipizzazione di tutto il codice, mi ha consentito di migrare intere
applicazioni (non troppo complesse...) da VB6.0 a 
VB.NET
 con il Wizard della
Microsoft. :-))))))
Ciao
Alberto

 non sarà mantenuto nè in Vb.Net, nè in C#.
Notare che nel libro "Advanced Basic Visual Basic 5", edito nientepopodimeno
che dalla Microsoft Press, l'intero capitolo 5 dice che non si devono mai
tipizzare le variabili, ma conviene invece sempre utilizzare i Variant. Pur
essendo meno rapidi nell'esecuzione dei calcoli, e occupando + memoria delle
variabili tipizzate, in questo capitolo si "dimostra" con alcuni esempi che
le variabili di tipo Variant
risultano + comode e permettono una più facile manutenibilità del codice.
Siccome questa perla di libro era pure inserito nei CD dell'MSDN library,
immaginati tu quante vittime ha fatto.
Dopo questa e altre cappelle,  ho per lo meno imparato a prendere sempre con
beneficio di inventario quello che dice mamma Microsoft a riguardo dei
propri prodotti, dato che "ogni scarrafone (baco) è bello a mamma
(Microsoft) sua".
Ciao
*Roby*

 Microsoft. :-))))))
Come? solo con i valori di default?
ciao Alfonso


Diciamo che cerco di non estrarre i valori dal Field del Recordset, quando
sono NULL, cosicché non mi servono quasi mai variabili di appoggio.
Siccome nei DB disegnati da me il NULL non esiste proprio (e fino ad oggi
non mi sono mai trovato in condizioni per cui fosse assolutamente
necessario), il problema mi si pone intervenendo su DB esistenti, dove posso
lavorare sull'applicazione ma non sul DB.
In tal caso, in passato utilizzavo effettivamente i Variant, poi mi sono
reso conto che erano più le volte che mi si creava qualche problema perchè
trascuravo di controllare se il valore era null, che i reali benefici di
avere una variabile tuttofare.
I valori di default, o la scritta Null, Non inserito, o altro messaggio,
sono riferiti ovviamente alla sola visualizzazione per l'utente o la stampa,
visto che di fatto il valore rimane all'interno del Recordset.
Per la visualizzazione in Label o TextBox, se mi servono variabili di
appoggio esse sono di tipo String, visto che comunque la conversione in
stringa deve essere fatta qualunque sia il tipo del dato, e che le
conversioni implicite sono di fatto abolite da .Net.
Ad esempio, se ho un recordset RS, con il campo IMPORTO, e devo visualizzare
in una label il valore di questo campo, potrei utilizzare due modi:
Label1.caption=cstr(rs.fields.item("Importo").value) 'quindi passaggio
diretto dal recordset alla Label
oppure
Dim Variab as string
Variab=cstr(rs.fields.item("Importo").value)
Label1.caption=Variab 'Quindi con passaggio attraverso una variabile
Se il campo può contenere valori nulli, semplicemente controllo il valore:
Dim Variab as string
if isnull(rs.fields.item("Importo").value) then
    Variab="Importo Mancante"
else
    Variab=cstr(rs.fields.item("Importo").value)
endif
Label1.caption=Variab
Ovviamente è molto macchinoso, ma questa filosofia di programmazione (su cui
accetto volentieri commenti e suggerimenti), mi ha consentito di superare
indenne nuove release, passaggi fra diversi linguaggi, e soprattutto ho
visto che la roba scritta in VB6.0 è passata in VB.Net molto bene.
Ciao
Alberto