[VB.Net / SQL Express]Constraint Exception vangen

Pagina: 1
Acties:

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-12 12:24
Ik ben bezig met wat te spelen in Visual Basic.Net en nu loop ik tegen het volgende probleem aan:

Met behulp van de dataset designer in Visual Studio 2005 heb ik een dataset gemaakt. Nu heb ik deze dataset gekoppeld aan een formulier met bijbehorende Tableadapter en Bindingsource. In de database heb ik een primary key aangemaakt welke niet autonummering is en veranderd kan worden door de de gebruiker. Echter wanneer ik een id ingeef welke al bestaat en ik verander van record dan gooit hij uiteraard een Unhandled Constraint Exception eruit. Nu wil ik deze foutmelding afvangen, maar ik heb werkelijk geen idee waar ik deze kan afvangen. Ik doe in me code verder niets voordat deze fout optreed.

Ik heb gekeken naar de verschillende events die ik eventueel zou kunnen gebruiken, maar de enige die me bruikbaar leek, die doet het niet. Tenminste hij gooit voordat deze event optreed al de exception. Dit was de dataerror van de bindingsource. Dus ergens zou ik het vooraf af moeten kunnen vangen, maar waar?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Afgezien van het feit dat je de gebruiker nooit de PK zou moeten/mogen laten specifieren, zou je eens kunnen kijken naar de ColumnChanging event van je DataTable oid. Deze wordt geraised wanneer je de waarde v/e column changed. Daar zou je dus kunnen testen als de column waarin die PK wordt opgeslagen gewijzigd wordt, en daar testen of de ingegeven waarde uniek is....

(Wel vreemd dat de DataTable een TableNewRow, Deleting/Deleted en RowChanging/RowChanged events heeft, maar geen event heeft dat geraised wordt op het moment dat de Row a/d Table ge-added wordt).

Dit is natuurlijk wel een beetje het nadeel van al die 'RAD' tools; op den duur weet je niet meer wat er eigenlijk precies allemaal gebeurd

https://fgheysels.github.io/


  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-12 12:24
In de designer kun je gebruik maken van een Partitial class. Nu heb ik daar alle events eens aangemaakt en een messagebox ingezet. Voordat de fout optreed worden de columnchanging en columnchanged events gedaan.

Hierin kan ik controleren op errors.
Visual Basic .NET:
1
2
3
If e.Row.HasErrors Then
  MessageBox.Show("ERROR")
End If


Maar deze geeft dus niet aan dat er een error plaats vind. Moet ik dan eerst een query naar de database sturen en kijken of de waarde al bestaat? Er moet toch een mogelijkheid bestaan om de exception op te vangen en de update te cancelen?

[ Voor 18% gewijzigd door Phenomenon op 09-04-2007 21:25 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Nee, dat zeg ik ook niet; ik zeg dat je in de RowChanging event kan kijken of je PK waarde die je net hebt ingegeven, wel uniek is. En indien dit niet het geval is, kan je zelf een foutmelding geven oid.

https://fgheysels.github.io/


  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-12 12:24
Aaah ok :)

Ik heb het nu met het volgende voor elkaar, maar vind het niet echt een nette oplossing eigenlijk.

Visual Basic .NET:
1
2
3
4
5
6
7
8
Private Sub ProductsDataTable_ColumnChanging(ByVal sender As Object, ByVal e As System.Data.DataColumnChangeEventArgs) Handles Me.ColumnChanging
For intA As Long = 0 To (Me.Count - 1)
  If (e.Column.ColumnName = "id") And (e.ProposedValue = Me.Item(intA).id) Then
    e.Row.SetColumnError("Id", "Het artikelnummer moet een unieke waarde hebben")
    e.Row.CancelEdit()
  End If
Next
End Sub


Nu gaat hij dus bij elke keer dat het column id veranderd door heel de recordset heen lopen. Mwaah niet echt wat hè?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Een DataTable heeft ook een Find method ....

Maar, het is niet omdat een bepaalde waarde niet in je dataTable voorkomt, dat 'ie daarom niet in je Database voorkomt...

[ Voor 58% gewijzigd door whoami op 09-04-2007 23:01 ]

https://fgheysels.github.io/

Pagina: 1