PDA

View Full Version : [VB.NET] Gestire InvalidOperationException


Traxsung
20-08-2007, 11:22
Ragazzi mi trovo di fronte a questo problema

http://img520.imageshack.us/img520/8025/erroreeu9.th.jpg (http://img520.imageshack.us/my.php?image=erroreeu9.jpg)

in pratica non è stata gestita InvalidOperationException


Potete spiegarmi come gestirla??

Grazie
Traxsung

Luc72
20-08-2007, 11:32
quel pulsante si trova sullo stesso form? come hai istanziato il form? visualizzandolo semplicemente (.show) oppure creando un oggetto, ad esempio:
dim FRM_Main as new frmxxxxx
application.run(FRM_Main)

oppure
dim FRM_Main as new frmxxxxx
FRM_Main.show

rimango in attesa :)

qwerty86
20-08-2007, 11:33
Questo è il modo per gestire le eccezioni :
try
'Codice che potrebbe generare un errore.
Catch
'Codice da eseguire in caso di errore.
Finally
'Codice da eseguire sia che si sia verificato un errore nel
'blocco try sia che non ci siano stati problemi.
End try


questo è un esempio :

try
Dim A As Byte = 100
Dim B As Byte = A * A
Catch ex As OverflowException
MsgBox("Si è verificato un errore: " & ex.Message)
End try

Traxsung
20-08-2007, 11:37
si, il pulsante si trova sullo stesso form
Cmq non effettuo nessun Form.show in quanto il tutto è costituito da un solo form

Traxsung
20-08-2007, 11:47
qwerty86...fammi capire una cosa..
Allora il debug mi comunica che c'è InvalidOperationException non gestita e mi indica come riferimento la stringa che ti ho riportato mediante immagine.
Nella fattispecie

btnApagarImagem.Enabled = False

Adesso il sorgente è qusto:

Ligacao2.Open()
Sql = "Select imagem From capas where id_imagem=" & idRegisto

Comando2 = New OleDbCommand(Sql, Ligacao2)
Comando2.CommandType = CommandType.Text

RS2 = Comando2.ExecuteReader
RS2.Read()

If RS2.HasRows Then
Dim bytes() As Byte
Dim imgStream As MemoryStream
bytes = CType(RS2("imagem"), Byte())
imgStream = New MemoryStream(bytes)
picImagem.Image = Image.FromStream(imgStream)
btnApagarImagem.Enabled = False
btnImprimir.Enabled = False
btnGuardarFicheiro.Enabled = False
Else
picImagem.Image = Image.FromFile(Application.StartupPath & "\no_picture.jpg", True)
btnApagarImagem.Enabled = True
btnImprimir.Enabled = True
btnGuardarFicheiro.Enabled = True
End If
RS2.Close()
Ligacao2.Close()
End Sub

l'InvalidOperationException dove la devo gestire?

Luc72
20-08-2007, 11:48
mmm e' un po' strano che ti dia quell'errore, in fondo stai solo abilitando un pulsante.. scusa la domanda banale: il pulsante sul form e' gia' stato creato vero? in debug riesci a vedere le proprieta' del pulstante?
cmq visto che hai un solo form ti conviene creare un modulo bas e lanciare il form da questo, almeno riesci a gestire gli errori a livello generale...

Sub main()
Try
Dim FRM_Main as New frmcomesichiama
Application.Run(FRM_Main)

Catch ex As Exception
MessageBox.Show("FATAL ERROR - " & ex.message, "mioprg", MessageBoxButtons.OK)

'eventualmente qui puoi rilanciare in automatico l'applicazione
Finally
Shell(Application.ExecutablePath)

End Try
End Sub

nel progetto imposti come startup la sub main di questo modulo.

qwerty86
20-08-2007, 11:53
Prova come ha detto Luc72

Traxsung
20-08-2007, 11:54
Luc72...scusami ma non ti seguo...puoi spiegarmi meglio ?

qwerty86
20-08-2007, 12:00
btnApagarImagem.Enabled = False

prova a commentarlo e vedere se è solo lui che da problemi o anche gli altri

Traxsung
20-08-2007, 12:03
ok qwerty86....adesso provo

Traxsung
20-08-2007, 12:07
sembra strano, ma commentando

'btnApagarImagem.Enabled = False
'btnImprimir.Enabled = False
'btnGuardarFicheiro.Enabled = False

sembra andrare tranquillamente

qwerty86
20-08-2007, 12:08
sembra strano, ma commentando

'btnApagarImagem.Enabled = False
'btnImprimir.Enabled = False
'btnGuardarFicheiro.Enabled = False

sembra andrare tranquillamente

perchè devi disabilitare questi pulsanti ?

Traxsung
20-08-2007, 12:11
sempre per il fatto che se fanno già una cosa non devo più farla fare...

qwerty86
20-08-2007, 12:20
sempre per il fatto che se fanno già una cosa non devo più farla fare...

ora devo scappare , poi mi spieghi meglio e vediamo di risolvere.:)

Traxsung
20-08-2007, 12:27
ok...grazie di tutto :)

Einstein
20-08-2007, 12:40
Sembra che la lettura del datareader avvenga in un thread diverso da quello dell'interfaccia, e l'architettura di Windows impone che il solo il thread associato all'interfaccia possa accedere ai controlli. Hai abilitato le connessioni asincrone sulla connection string?
Ah, occhio alla SQL injection in questo codice:

Sql = "Select imagem From capas where id_imagem=" & idRegisto

Traxsung
20-08-2007, 12:52
Sembra che la lettura del datareader avvenga in un thread diverso da quello dell'interfaccia, e l'architettura di Windows impone che il solo il thread associato all'interfaccia possa accedere ai controlli.

mi spieghi meglio questo?? Si tratta di multithread??
Cosa devo/posso modificare per renderlo corretto??

Inoltre non ho mai capito il fatto del SQL injection

Puoi spiergarmi anche questo???

Grazie

Einstein
20-08-2007, 12:59
E' un argomento un po' complesso da spiegare in un post... Guardati la documentazione della proprietà InvokeRequired su MSDN.
Per quanto riguarda la SQL Injection:

http://www.algonet.se/~sommar/dynamic_sql.html

Ciao

Traxsung
20-08-2007, 14:38
ho cantato troppo presto vittoria
ho provato ad aprire il file nome.vb per poterne modificare l'interfaccia grafica, ma ottengo questi errori;

http://img410.imageshack.us/img410/633/errorecl6.th.jpg (http://img410.imageshack.us/my.php?image=errorecl6.jpg)


che faccio ?

Luc72
20-08-2007, 15:01
ho cantato troppo presto vittoria
ho provato ad aprire il file nome.vb per poterne modificare l'interfaccia grafica, ma ottengo questi errori;

http://img410.imageshack.us/img410/633/errorecl6.th.jpg (http://img410.imageshack.us/my.php?image=errorecl6.jpg)


che faccio ?

semplicemente hai toccato qualcosa che non dovevi toccare.... ovviamente hai un backup vero? :)

Riguardo all'sql injection la variabile idRegisto NON la devi passare nuda e cruda all'oggetto sql... altrimenti qualcuno un po' smaliziato potrebbe cancellarti in un attimo tutto il db... la prima cosa da fare e' un bel replace degli apici con i doppi apici .replace("'","''"), cmq il discorso e' troppo lungo..

Traxsung
20-08-2007, 15:02
per il backup credo di si, cmq mo verifico e vi aggiorno

Per l'sql injection...vediamo se riesco a capire bene come funziona (anche se ho i miei dubbi)

Traxsung
20-08-2007, 15:07
niente, ho provato anche con il backup, ma ottengo sempre la stessa schermata di errore.
Che posso fare?