[vb/ado] Errorhandling

Pagina: 1
Acties:

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
Oplossing:24-12-2003:
Lister schreef op 23 december 2003 @ 19:40:
Ik heb zelf even lopen testen en het gaat inderdaad allemaal wel wat vaag en ik snap het nog niet helemaal maar als er een fout is opgetreden moet je geen CancelUpdate maar een CancelBatch doen.
Dat lijkt hier tenminste te werken.
Goed ik heb een forumulier met een datacontrol en een datagrid.

Als ik nu een record toevoeg in de recordset die aan de datacontrol gekoppeld is, gaat alles goed, maar wanneer ik bijvoorbeeld een record wil toevoegen met het hetzelfde artikel, dan krijg ik dus een fout, dat hij geen dubbele waarden kan toevoegen. Dit klopt ook door me database design, maar nu krijgen we het probleem 'Het opvangen van die fout'.

Visual Basic:
1
2
3
4
5
6
7
On Error Resume Next
Ado_Data.Recordset.AddNew
Ado_Data.Recordset("HoofdPlu") = Plu_Num
Ado_Data.Recordset("ing_plu") = app_Plu
Ado_Data.Recordset.Update
If DbsFunc.CheckForErrors = True Then Exit Sub
On Error GoTo 0


Class DbsFun
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim Ado_Err As ADODB.Error
Dim str_Error As String
    If Con.Errors.Count > 0 Then
        For Each Ado_Err In Con.Errors
            str_Error = "Er zijn fouten opgetreden bij het benaderen van de database." & vbCr & vbCr
            str_Error = str_Error & Ado_Err.Number & ":" & Ado_Err.Description & vbCr
            str_Error = str_Error & "Native Error:" & Ado_Err.NativeError & vbCr
            str_Error = str_Error & "Source:" & Ado_Err.Source & vbCr
            str_Error = str_Error & "Sql State:" & Ado_Err.SQLState
        Next
        MsgBox str_Error, vbCritical
        CheckForErrors = True
    Else
        CheckForErrors = False
        
    End If


Zover gaat het goed, ik krijg netjes mijn eigengemaakte error te zien, echt hierna komt de grid ook weer met een error. En het lijkt wel of ik deze op geen enkele manier kan afvangen. Wat is een beetje een juiste errorhandling hiervoor?

[ Voor 36% gewijzigd door Phenomenon op 24-12-2003 09:44 ]


  • mboy
  • Registratie: December 2001
  • Laatst online: 20-06-2024
Wanneer VB de error geeft staat daar vaak een error number bij. Je zou dan de error kunnen afvangen op de volgende manier:

Visual Basic:
1
2
3
if err.number = <error nummer> then
    <show errormessage>
end if

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
Jah zover ben ik, maar het is toch raar wanneer er in de datacontrol een update niet doorgaat, dat hij hem daarnaar nog ff fijntjes probeert toe te voegen in de datagrid?

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 15:52

pistole

Frutter

Phenomenon schreef op 23 december 2003 @ 11:36:
Jah zover ben ik, maar het is toch raar wanneer er in de datacontrol een update niet doorgaat, dat hij hem daarnaar nog ff fijntjes probeert toe te voegen in de datagrid?
heb je ook een errorhandler aan die grid gehangen?
Je vangt namelijk nu de fout af in de control die achter de grid hangt, maar die geeft uiteindelijk ook een "fout" terug aan de grid zelf

ofzo.

[ Voor 19% gewijzigd door pistole op 23-12-2003 11:41 ]

Ik frut, dus ik epibreer


  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
pistole schreef op 23 december 2003 @ 11:40:
[...]

heb je ook een errorhandler aan die grid gehangen?
Je vangt namelijk nu de fout af in de control die achter de grid hangt, maar die geeft uiteindelijk ook een "fout" terug aan de grid zelf

ofzo.
Nope heb ik er niet aan hangen, waarom zou ik 2 controle's op error moeten doen, dan lijkt me zo overbodig he.

Wanneer een update in de datacontrol niet doorgaat, moet de datagrid hem toch niet nog een keer gaan toevoegen? De datagrid haalt zijn source uit de datacontrol, dus als ik zeg in de de datacontrol 'Deze recordset update gaat mooi niet door', dan verwacht ik toch ook niet dat de datagrid, dit wel probeert door te voeren?

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 15:52

pistole

Frutter

Phenomenon schreef op 23 december 2003 @ 11:45:
[...]


Nope heb ik er niet aan hangen, waarom zou ik 2 controle's op error moeten doen, dan lijkt me zo overbodig he.

Wanneer een update in de datacontrol niet doorgaat, moet de datagrid hem toch niet nog een keer gaan toevoegen? De datagrid haalt zijn source uit de datacontrol, dus als ik zeg in de de datacontrol 'Deze recordset update gaat mooi niet door', dan verwacht ik toch ook niet dat de datagrid, dit wel probeert door te voeren?
Okee, ben ik met je eens. Maar waaruit blijkt dat de grid het "nogmaals probeert"? M.a.w., wat is de exacte foutmelding en/of is de foutmelding hetzelfde als de foutmelding in je datacontrol?

Ik frut, dus ik epibreer


  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
Eigen errorhandling
Afbeeldingslocatie: http://www.xs4all.nl/~velema/fout1.jpg

Datagrid error melding:
Afbeeldingslocatie: http://www.xs4all.nl/~velema/fout2.jpg

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 15:52

pistole

Frutter

hmm exact hetzelfde dus het lijkt erop dat de grid de eventuele foutmelding die hij terugkrijgt van de datacontrol exact weergeeft. Misschien zou je de errors moeten weggooien aan het eind van je handler, of evt je errorhandler moeten koppelen aan de grid ipv de control?

Ik vind het moeilijk uit te leggen maar ik vind het wel logisch dat je grid ook een fout geeft; hij krijgt namelijk een fout terug van de control...

Ik frut, dus ik epibreer


  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
Mjaaah ik vind dat niet echt logisch. Waarom een fout geven, als die al opgelost is?

Ik heb geprobeerd een cancelupdate en een err.clear, maar het blijft het maar geven.

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
Ik snap trouwens wel meer niet, de event van het ado recordset wordt ook niet gestart :|

Visual Basic:
1
2
3
Private Sub Ado_Data_Error(ByVal ErrorNumber As Long, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, fCancelDisplay As Boolean)

End Sub

  • Lister
  • Registratie: September 2001
  • Laatst online: 15-02-2022
Het is wel zo netjes om de errors te clearen als je ze afgehandeld hebt en dan niet alleen een Err.Clear na de Recordset.Update maar ook een Con.Errors.Clear na het uitlezen van de foutmeldingen in CheckForErrors, waarschijnlijk wordt die ook nog gecontroleerd door de ADO control.

En als dat niet werkt kan je het tonen van die extra messagebox uitzetten door in het Error-event van je datacontrol fCancelDisplay op True zetten. Ik zou dat dan wel voorlopig alleen voor deze specifieke foutmelding doen anders mis je misschien andere foutmeldingen.

  • Lister
  • Registratie: September 2001
  • Laatst online: 15-02-2022
Phenomenon schreef op 23 december 2003 @ 13:22:
Ik snap trouwens wel meer niet, de event van het ado recordset wordt ook niet gestart :|

...
Maar daar staat ook niks in 8)7

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 15:56
Waarom gebruik je geen try catch ?

Visual Basic:
1
2
3
4
5
6
7
Try
  Ado_Data.Recordset.Update
Catch e As Exception
  Messagebox.show("Fout")
  exit sub
  End
End Try

[ Voor 8% gewijzigd door Remco op 23-12-2003 13:43 ]

The best thing about UDP jokes is that I don't care if you get them or not.


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 26-05 18:25

Sponge

Serious Game Developer

Dat wil niet echt in VB6 vrees ik :). Dat lijkt me ook meer VB.NET wat je daar hebt :)

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 15:56
oeps, over het hoofd gezien. :Z

The best thing about UDP jokes is that I don't care if you get them or not.


  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
Lister schreef op 23 december 2003 @ 13:26:
[...]


Maar daar staat ook niks in 8)7
Neeeh het ging ook ff om het idee :+
Lister schreef op 23 december 2003 @ 13:25:
Het is wel zo netjes om de errors te clearen als je ze afgehandeld hebt en dan niet alleen een Err.Clear na de Recordset.Update maar ook een Con.Errors.Clear na het uitlezen van de foutmeldingen in CheckForErrors, waarschijnlijk wordt die ook nog gecontroleerd door de ADO control.

En als dat niet werkt kan je het tonen van die extra messagebox uitzetten door in het Error-event van je datacontrol fCancelDisplay op True zetten. Ik zou dat dan wel voorlopig alleen voor deze specifieke foutmelding doen anders mis je misschien andere foutmeldingen.
Jah maar dat is dus een ander probleem, dat event wordt dus niet gestart.

  • Lister
  • Registratie: September 2001
  • Laatst online: 15-02-2022
Phenomenon schreef op 23 december 2003 @ 14:00:

[...]


Jah maar dat is dus een ander probleem, dat event wordt dus niet gestart.
Maar in welk event/functie/sub en op welke regel treedt dan precies die tweede foutmelding op?
Je kan dat makkelijk vinden door als de messagebox getoond wordt op CTRL-BREAK te drukken, dan springt de VB editor als het goed is naar het statement dat de melding veroorzaakt.

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
Die tweede foutmelding treed dus niet in de code op, maar komt 'rechtstreeks' uit de datagrid. Waarschijnlijk omdat de datagrid refreshed als er gegevens gewijzigd worden. Maar er is dus ook geen event welke ik kan gebruiken van de datagrid, om deze foutmelding te onderdrukken.

  • Lister
  • Registratie: September 2001
  • Laatst online: 15-02-2022
Phenomenon schreef op 23 december 2003 @ 14:12:
Die tweede foutmelding treed dus niet in de code op, maar komt 'rechtstreeks' uit de datagrid. Waarschijnlijk omdat de datagrid refreshed als er gegevens gewijzigd worden. Maar er is dus ook geen event welke ik kan gebruiken van de datagrid, om deze foutmelding te onderdrukken.
Je datagrid is toch gekoppeld aan een datacontrol, dan moet je in dit geval bij de events van de datacontrol kijken en niet die van de datagrid.
In het Error event zou je het moeten kunnen afvangen zoals ik hierboven al zei en eventueel nog het MoveComplete event.

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
Lister schreef op 23 december 2003 @ 14:55:
[...]


Je datagrid is toch gekoppeld aan een datacontrol, dan moet je in dit geval bij de events van de datacontrol kijken en niet die van de datagrid.
In het Error event zou je het moeten kunnen afvangen zoals ik hierboven al zei en eventueel nog het MoveComplete event.
Yup en dan krijgen we weer bovenstaande verhaal, dat er geen event getriggerd wordt :|

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
Ff een beknopte uitleg nog dan.

1 Ado Recordset
1 Ado Datacontrol
1 Ado Datagrid

De Datagrid heeft als recordsource Datacontrol. Datacontrol heeft als recordsource de Ado Recordset. De Datacontrol wordt geupdate met behulp van .addnew en .update. en geeft een foutmelding bij dubbele waarden. Deze kan ik afvangen, maar hierna komt de datagrid ook weer met een foutmelding, welke ik dus niet kan afvangen.

Tevens worden er geen events gestart voor de Datacontrol. Zooow is het ongeveer :)

  • Lister
  • Registratie: September 2001
  • Laatst online: 15-02-2022
Ik heb zelf even lopen testen en het gaat inderdaad allemaal wel wat vaag en ik snap het nog niet helemaal maar als er een fout is opgetreden moet je geen CancelUpdate maar een CancelBatch doen.
Dat lijkt hier tenminste te werken.

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
Ik zou toch zweren dat Cancelbatch voor transactions waren, maar ik zal dat morgen eens proberen :)

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
Lister schreef op 23 december 2003 @ 19:40:
Ik heb zelf even lopen testen en het gaat inderdaad allemaal wel wat vaag en ik snap het nog niet helemaal maar als er een fout is opgetreden moet je geen CancelUpdate maar een CancelBatch doen.
Dat lijkt hier tenminste te werken.
Jah dat werkt hier inderdaad ook goed, beetje vreemd, maar wel lekker :)

Hey hartelijk bedankt :)
Pagina: 1