Record inesistente

mercoledì 06 febbraio 2008 - 11.27

albedo Profilo | Junior Member

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

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

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

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

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

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

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

>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

OK, sei stato chiarissimo.

Un bacio.

Ciao.
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