[VB.net] dataset wil niet updaten

Pagina: 1
Acties:

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-08 16:11
Ik tover wat gegevens naar voren met behulp van een dataset uit een access bestand.
Deze gegevens laat ik in een textbox zien.
Als ik de gegevens wijzig, en daarna een update doe:
Visual Basic:
1
OleDbDataAdapter1.Update(Dsgebruikers1)

Dan worden gegevens niet opgeslagen.

Maar.....
Als ik eerst naar het volgende of vorige record ga met:
Visual Basic:
1
Me.BindingContext(Dsgebruikers1, "Gebruikers").Position -= 1

en dan opslaan met:
Visual Basic:
1
OleDbDataAdapter1.Update(Dsgebruikers1)

dan worden de gegevens wel bewaard.

Heel vreemd, het lijkt erop ofdat eerst de focus van het veld verandert moet worden om te kunnen updaten.
Ook de functie:
Visual Basic:
1
Dsgebruikers1.HasChanges 

herkent niet dat er iets verandert is totdat ik naar het volgende of vorige record ga.
Dan pas word de wijziging wel opgemerkt.

Ik heb uiteraard gezocht bij google en msdn, maar ik kan het niet vinden.

Heeft iemand hier een oplossing voor ?

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


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Hoe update je een record? Niet iedere methodiek zorgt er nl voor dat de gegevens goed weergegeven worden als 'changed' in een dataset.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-08 16:11
D.m.v. een keyboard invoer.
Maar ook zonder die changed proc. ziet hij geen wijziging.
pas na een record verhoging/verlaging.

[ Voor 65% gewijzigd door Remco op 26-06-2003 20:21 ]

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


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 31-07 00:06
Aan het gebruik van BindingContext zie ik dat het om een Winforms applicatie gaat. Hierbij is het handig om te weten dat er bij databinding altijd een CurrencyManager of een PropertyManager tussen de datasource en de controls zit. Als je form elementen gebonden zijn aan de properties van een enkel object gaat dat via de PropertyManager en in andere gevallen (collections, dataviews e.d.) via de CurrencyManager die tevens ook als een soort van cursor fungeert.
De CurrencyManager komt impliciet al tevoorschijn in deze code:
Visual Basic .NET:
1
Me.BindingContext(Dsgebruikers1, "Gebruikers").Position -= 1

Doordat VB.NET default impliciete casts toestaat zie je niet dat er eigenlijk dit staat:
Visual Basic .NET:
1
2
Dim cm As CurrencyManager = CType(Me.BindingContext(Dsgebruikers1, "Gebruikers"), CurrencyManager)
cm.Position -= 1

Om een of andere reden voert de CurrencyManager niet direct wijzigingen door op de onderliggende datasource, maar doet dat bijvoorbeeld pas nadat hij naar een volgend item verwezen wordt (zoals je gemerkt hebt :)).
Je kunt echter de CurrencyManager wel forceren om een update te doen door
Visual Basic .NET:
1
cm.EndCurrentEdit()

aan je code toe te voegen op het punt waar je absoluut de datasource geupdate wilt hebben.

Cuyahoga .NET website framework


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-08 16:11
Ik zal het even proberen.
Zit nu op mijn werk, dus kan het nu niet proberen.

Maaaaarrrr......
Ik heb op het form ook een knopje sluiten.
Als een record gewijzigd is, moet de vraag gesteld worden met yes,no,cancel of de wijzigingen opgeslagen moeten worden.
Dit doe ik aan de hand van die check
Visual Basic:
1
if not Dsgebruikers1.HasChanges then exit sub

Maar deze word door jouw methode dan nog steeds niet herkend.
Of moet ik moet toch maar een += en een -= achter elkaar doen voordat de check word uitgevoerd. Is niet netjes, maar werkt wel.

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:40
ranzige check vind ik.

Waarom niet:
code:
1
2
3
if DsGebruikers.HasChanges then
  dataAdapter.update(dsGebruikers);
end;

oid?

Die EndCurrentEdit method is wel een member van een currencyManager, en niet van een DataSet

[ Voor 27% gewijzigd door whoami op 27-06-2003 11:26 ]

https://fgheysels.github.io/


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-08 16:11
Ok, tnx.
Dat werkt dus.
Alleen moet ik elke keer:
Visual Basic:
1
2
3
        Dim cm As CurrencyManager = CType(Me.BindingContext_
(Dsgebruikers1, "Gebruikers"), CurrencyManager)
        cm.EndCurrentEdit()

doen om die cm te "dimmen".
Ik had hem al als public dim opgegeven, maar dan komt er een null-exception uit.

* Remco denkt dat er nogal wat te lezen valt voor hem m.b.t. data-binding en ctypes ... ;(

[ Voor 6% gewijzigd door Remco op 30-06-2003 16:21 ]

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

Pagina: 1