Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Record inesistente
mercoledì 06 febbraio 2008 - 11.27
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
albedo
Profilo
| Junior Member
59
messaggi | Data Invio:
mer 6 feb 2008 - 11:27
Ciao a tutti
Spero vogliate spiegarmi come risolvere un probleme che per voi sarà banale, ma per uno alle prime armi come me è difficile da suoerare, dunque:
Ho una tabella ARTICOLI con due campi: ID_ART e ARTICOLO
In questa tabella ci sono 50 record
ID_ART | ARTICOLO
1 | Pinze
2 | Martello
3 | Chiodi
4 | Vite
5 | Giravite
Ho una datagridview in cui, digitando un valore di ID_ART mi riporta il corrispondente articolo in un'altra cella della datagridview.
ora vorrei fare in modo che se si digita un codice cui non corrisponde alcun articolo (adesempio, 6) compaia un msgbox che mi avvisi.
Ho ustao questo codice, ma non funziona:
sql = "select ARTICOLO from ARTICOLI where ID_ART=?"
Dim cmd As New OleDb.OleDbCommand(sql, cn)
cmd.Parameters.AddWithValue("ID_ART", Griglia_Vendite.Item(3, rw).Value)
dr = cmd.ExecuteReader
Do While dr.Read
If dr.HasRows Then
If dr.Item(1) Is Nothing Then
MsgBox("???")
Else
Griglia_Vendite.Item(4, rw).Value = dr.Item("ARTICOLO")
End If
End If
Loop
dr.Close()
Grazie
Wamba
Profilo
| Expert
722
messaggi | Data Invio:
mer 6 feb 2008 - 13:42
ciao,
se non ci sono riusultati "If dr.HasRows Then" è false. Metti un break point e controlla.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
blogs.ugidotnet.org/WamBlog/
www.intellimaker.com
albedo
Profilo
| Junior Member
59
messaggi | Data Invio:
mer 6 feb 2008 - 13:52
Ciao
Non ci sono record che abbiano ID_ART uguale a 6, ok... quindi, hasrows è false, ok... ma il punto è che se questa condizione è vera non mi restituisce alcun errore, semplicemente non mi passa lacun valore nella cella della datagridview, viceversa, se digito 2 (e quindi la condizione hasrows è vera) mi aggiorna la cella della datagridview che deve contenere l'articolo corrispondente all ID_ART = 2, cioè Martello.
Grazie
Wamba
Profilo
| Expert
722
messaggi | Data Invio:
mer 6 feb 2008 - 13:57
ho visto un altro errore che mi era sfuggito prima
Do While dr.Read
If dr.HasRows Then
....
se la query non ha risultati non entra nel while perchè dr.read restituisce false.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
blogs.ugidotnet.org/WamBlog/
www.intellimaker.com
albedo
Profilo
| Junior Member
59
messaggi | Data Invio:
mer 6 feb 2008 - 14:20
ok, chiaro... quindi, come accennavo prima, dal momento che mi sto affacciando adesso al SQL non è che mi spiegheresti come risolvere l'errore? Devo usare qualche altracosa invece del reader?
Ciao
Wamba
Profilo
| Expert
722
messaggi | Data Invio:
mer 6 feb 2008 - 14:40
Scusami, ho dato per scontato
Prima di tutto: non ho visto il try catch finally :
http://support.microsoft.com/kb/315965
Assicurati di chiudere la connessione (se possibile) e il DR (sicuramente) nel finally.
If dr.HasRows Then
Do While dr.Read
[Codice da eseguire normalmente]
Loop
Else
[Codice da eseguire se non hai risultati]
End If
Se hai ancora dubbi chiedi pure
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
blogs.ugidotnet.org/WamBlog/
www.intellimaker.com
albedo
Profilo
| Junior Member
59
messaggi | Data Invio:
mer 6 feb 2008 - 15:11
ok, funziona perfettamente e non ti ringrazierò mai abbastanza
Ti faccio vedere com è strutturata la SUB per intero:
Sub CARICA_ART()
Try
sql = "select ARTICOLO from ARTICOLI where ID_ART=?"
Dim cmd As New OleDb.OleDbCommand(sql, cn)
cmd.Parameters.AddWithValue("ID_ART", Griglia_Vendite.Item(3, rw).Value)
dr = cmd.ExecuteReader
If dr.HasRows Then
Do While dr.Read
Griglia_Vendite.Item(4, rw).Value = dr.Item("ARTICOLO")
Loop
Else
MsgBox("qui ci scriverò qualcosa")
End If
If Griglia_Vendite.Item(11, rw).Value > 0 Then
cmd = New OleDb.OleDbCommand("UPDATE VENDITE SET ID_AR = " & Griglia_Vendite.Item(3, rw).Value & ", ARTICOLO = '" & Griglia_Vendite.Item(4, rw).Value & "' WHERE ID_VEN = " & Griglia_Vendite.Item(11, rw).Value, cn)
dr = cmd.ExecuteReader
End If
Catch
Finally
dr.Close()
End Try
End Sub
Capisco a cosa possa servire il Try --> Catch --> Finally, ma in questo caso, propio non hi idea di cosa mettere come eccezione dopo il Catch... cioè cosa dovrei gestire e come, visto che l'errore eventuale viene già intercettato prima (if hasrows... else... end if).
Non mi conviene chiudere la connessione, ma il reader verrà chiuso se gestito dal finally?
In definitiva, in questo caso, l'eccezione Try, Catch, Finally non è superflua?
Grazie ancora
Wamba
Profilo
| Expert
722
messaggi | Data Invio:
mer 6 feb 2008 - 15:33
>ok, funziona perfettamente e non ti ringrazierò mai abbastanza
Non esagerare, "grazie" basta e avanza
>Ti faccio vedere com è strutturata la SUB per intero:
>
> Sub CARICA_ART()
>
> Try
>sql = "select ARTICOLO from ARTICOLI where ID_ART=?"
> Dim cmd As New OleDb.OleDbCommand(sql, cn)
>cmd.Parameters.AddWithValue("ID_ART", Griglia_Vendite.Item(3,
>rw).Value)
> dr = cmd.ExecuteReader
>
> If dr.HasRows Then
> Do While dr.Read
>Griglia_Vendite.Item(4, rw).Value = dr.Item("ARTICOLO")
> Loop
> Else
> MsgBox("qui ci scriverò qualcosa")
> End If
>
> If Griglia_Vendite.Item(11, rw).Value > 0 Then
>cmd = New OleDb.OleDbCommand("UPDATE VENDITE SET ID_AR = " &
>Griglia_Vendite.Item(3, rw).Value & ", ARTICOLO = '" & Griglia_Vendite.Item(4,
>rw).Value & "' WHERE ID_VEN = " & Griglia_Vendite.Item(11, rw).Value,
>cn)
> dr = cmd.ExecuteReader
> End If
> Catch
> Finally
> dr.Close()
> End Try
>
> End Sub
>
>Capisco a cosa possa servire il Try --> Catch --> Finally,
>ma in questo caso, propio non hi idea di cosa mettere come eccezione
>dopo il Catch... cioè cosa dovrei gestire e come, visto che l'errore
>eventuale viene già intercettato prima (if hasrows... else...
>end if).
Te hai gestito solo una delle possibili eccezioni. Possiamo dividere le eccezioni in due categorie "aspettate" e "inaspettate". Le eccezioni che ci aspettiamo possiamo dividerle in "aspettate e gestibili" e "aspettate e ingestibili".
Durante una connessione ad un db può succedere qualunque cosa, da "la segretaria inciampa nel cavo di rete", "il server si è riavviato" "è cambiata la password" o il più classico "la query è sbagliata". Puoi mandare un messaggio con il testo dell'eccezione (ex.message se non erro)
>Non mi conviene chiudere la connessione, ma il reader verrà chiuso
>se gestito dal finally?
certo sempre anche se fai una return nel corpo del try
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
blogs.ugidotnet.org/WamBlog/
www.intellimaker.com
albedo
Profilo
| Junior Member
59
messaggi | Data Invio:
mer 6 feb 2008 - 15:45
OK, sei stato chiarissimo.
Un bacio.
Ciao.
Torna su
Stanze Forum
Elenco Threads
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 !