Qery in Access da form VB.net

sabato 14 marzo 2009 - 19.54

Icilio Profilo | Newbie

Premesso che ho una variabile numerica pubblica che si chiama : numero_atto (il cui contenuto lo
visualizzo correttamente con un messagebox prima della query)

Se cerco di eseguire la seguente query mi genera un'eccezione e non riesco a capire il perchè :

Dim MiaQuerySql As String = "SELECT * FROM tabella_di_prova WHERE numero = numero_atto "

l'eccezione è : Tipi di dati non corrispondenti nell'espressione criterio.

Qualcuno potrebbe aiutarmi prima che dia fondo ad una intera confezione di AULIN ? ? ?

Gianni77 Profilo | Junior Member

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

Icilio Profilo | Newbie

Ho anche provato come dici tu, ma il risultato è sempre lo stesso, anche se tratto la
variabile come Stringa usando ' " & nome_variabile & " ' ottengo sempre la stessa
eccezione

Gianni77 Profilo | Junior Member

penso che arrivati a questo punto dovresti postare qualche parte di codice in più... L'eccezione ti viene restituita proprio sulla riga in cui dimensioni la querystring?

Icilio Profilo | Newbie

Grazie sei molto gentile ti posto una sintesi del codice che sto usando, il bello è che se nella Query
invece di mettere il nome della variabile metto il corrispondente valore il tutto funziona !!!

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Connessione.Open()

If Connessione.State = ConnectionState.Open Then
Dim numero_formalita As Integer = 15536
MessageBox.Show(numero_atto) ' mi serve per capire quanto vale la variabile

Dim MioCodiceSql As String = "SELECT * FROM preg_atti WHERE numero=numero_atto "
Dim MioCommand As New OleDbCommand(MioCodiceSql, Connessione)

Dim lettura As OleDbDataReader = MioCommand.ExecuteReader()
Do While lettura.Read()
txtNumero.AppendText(lettura.Item("numero"))
txtData.AppendText(lettura.Item("data_atto"))
' continuo il ciclo sugli altri campi della Tabella preg_atti
Loop
If txtNumero.Text = "" Then
MessageBox.Show("Attenzione nessun record corrisponde !")
End If
End If
Connessione.Close()
End Sub

alexmed Profilo | Guru

Ciao
Sei sicuro che il campo "numero_atto" nel database Access sia impostato su Integer?

Questa linea
MessageBox.Show(numero_atto.GetType.ToString)
cosa ti restituisce?

Poi non capisco questo

>Dim numero_formalita As Integer = 15536
>MessageBox.Show(numero_atto) ' mi serve per capire quanto vale la variabile

Dichiari "numero_formailita" e poi visualizzi "numero_atto"????

Ciao
alexmed

DomA Profilo | Expert

Ciao
dal tipo di errore concordo con alexmed

>Sei sicuro che il campo "numero_atto" nel database Access sia impostato su Integer?

Facci sapere
Domenico

luxsor Profilo | Guru

Ammesso che la dichiarazione della variabile non sia un errore ed il campo [numero] nel db esista ed è di tipo Integer, nella costruzione della query il paramentro lo devi passare al di fuori della stringa (senza gli apici perchè è di tipo integer).

Dim MioCodiceSql As String = "SELECT * FROM preg_atti WHERE numero=" & numero_atto

Facci sapere

alexmed Profilo | Guru

Ciao luxsor

La tua soluzione era già stata suggerita da Gianni nella prima risposta ma sembra non funzionare

Ciao
alexmed

luxsor Profilo | Guru

No il problema sono gli apici.
Un valore Integer non può essere passato con gli apici altrimenti di genera un'eccezione.

Gianni77 Profilo | Junior Member

x Luxor:
guarda che alexmed si riferiva alla mia prima risposta, in cui c'è scritto lo stesso codice che hai postato tu adesso.
E se leggi bene, come specificato più in alto, con apici, senza apici, incluso dall'esterno con &, genera sempre l'eccezione.

Il problema per me non sta nella stesura della query ma da qualche altra parte. Come dice alexmed potrebbe essere dato dal fatto che il campo non è dichiarato come integer nel database stesso, ma arrivati a quel punto, mettendo gli apici dovrebbe andare... e invece comunque non va... Io vorrei capire precisamente in quale punto del codice viene sollevata l'eccezione

Icilio Profilo | Newbie

Innanzi tutto ringrazio per l'interessamento, ma il problema è veramente "simpatico" .

Facendo un po' di chiarezza la variabile doveva essere nominata come : numero_atto contenente un numero il 15536
il GetType.ToString mi restituisce System.Int32
Nel database Access di riferimento il campo numero è un numero intero
Ma per qualche strano motivo la variabile numero atto (anche se trattata come stringa ) mi restitusce
la seguente eccezione : "Nessun valore specificato per alcuni parametri necessaria" la riga di codice interessata però dall'eccezione èè la seguente :

Dim lettura As OleDbDataReader = MioCommand.ExecuteReader()

Naturalmente se nella query sostituisco la variabile numero_atto con il suo valore 15536 il tutto funziona correttamente.

Gianni77 Profilo | Junior Member

guarda che è da pazzi...
io quando succedono cose cosi metto una messagebox prima della riga che da l'errore.
metti una messagebox che ti restituisce il valore della querystring prima della riga che ti da l'errore.
e poi: int32 è un intero a 32 bit (4 byte), controlla che pure il campo numerico in cui cerchi sia un intero a 4 byte (in access è long, intero lungo), anche se non penso sia questo il problema.

alexmed Profilo | Guru

Ciao
Taglierei la testa al toro!!

Questo è il codice:

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

Ed in allegato trovi un db Access che contiene la tabella "preg_atti" con i campi "numero" e "data"

Naturalmente puoi sostituire la MessageBox con .AppendText

Ciao

alexmed

Icilio Profilo | Newbie

Ci siamo quasi .....
non conoscevo la possibilità di eseguire un query con la sintassi che hai usato tu (chiudendo le virgolette
prima della variabile !) - riporto la tua Query :

Dim MioCodiceSql As String = "SELECT * FROM preg_atti WHERE numero =" & numero_atto

Ma se nella query voglio aggiungere nella clausola Where un'altra condizione tipo :

AND data_atto = variabile_data

che sintassi devo usare ?

luxsor Profilo | Guru

diventa così:

Dim MioCodiceSql As String = "SELECT * FROM preg_atti WHERE numero =" & numero_atto & " AND data_atto='" & variabile_data & "'"

Se data_atto è una stringa ci devi mettere le virgolette

Icilio Profilo | Newbie

Ma Access per il campo date accetta solo il cancelletto #02/07/1993# ma quando la data è una variabile che sintassi usare.
Comunque trattando la data come stringa il tutto funziona egregiamente.

luxsor Profilo | Guru

Se non erro se usi il simbolo # non devi mettere gli apici.
Alcuni formati sicuramente validi e funzionanti sono: #MM/DD/YYYY# e 'YYYY/MM/DD'

alexmed Profilo | Guru

Ciao
Dunque, nello specifico la stringa diventerebbe una cosa del genere:

Dim variabile_data As Date = "04/04/2009"

Dim MioCodiceSql As String = "SELECT * FROM preg_atti WHERE numero =" & numero_atto & " AND data_atto = " & variabile_data

ma a questo punto facciamo un passo avanti ed utiliziamo i parametri (query parametriche) che consentono una maggiore sicurezza al codice che scriviamo:

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

Ciao

alexmed

Icilio Profilo | Newbie

Alexmed grazie per il preziosissimo aiuto, non conosco ancora le Query parametriche, proverò il tuo codice, solo una curiosità ma il simbolo @ non viene utilizzato solo da Sql Server mentre per Access si dovrebbe usare il simbolo & ??

Comunque tieni presente che nel mio caso il numero_atto e la data_atto scaturiscono dall'evento doppio click su una datagridview posta in un altro Form, quindi non sono noti a priori , ma possono variare a seconda della scelta dell'utente.

alexmed Profilo | Guru

Per quanto riguarda la simbologia ho visto sempre usare la @ per i parametri e visto che funziona uso quello.
Tieni presente che il valore dei parametri sono come le variabili, quindi il valore lo puoi reimpostare ad ogni evenienza:
Ad esempio
>MioCommand.Parameters.Add("@numero", OleDbType.Integer).Value = 15536
diventa
>MioCommand.Parameters.Add("@numero", OleDbType.Integer).Value = Me.TextBox.Text
>MioCommand.Parameters.Add("@numero", OleDbType.Integer).Value = Me.DataGridView.Item(0,2).Value
e cosi via

Ciao

alexmed


{EDIT}
A meno che tu non ti riferisca alle query fatte direttamente in Access e quindi

WHERE data_atto=?;

Quindi passo il parametro con il punto interrogativo
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5