Toon posts:

[ADO.NET] Tabel wordt niet upgedate

Pagina: 1
Acties:

Verwijderd

Topicstarter
Volgend verhaal:

1. Oledbconnection gemaakt aan de hand van de wizard
2. Oledbdataadapter gemaakt aan de hand van de wizard
3. Dataset gegenereerd uit die dataadapter

Ophalen van de gegevens en weergeven in tekstvakken is geen probleem. Echter slaag ik er niet in, bij wijzigen, deze gegevens terug te sturen naar de database.

Daarvoor gebruik ik volgende code

<code>
Me.OleDbDataAdapter1.Update(DataSet11, "Klanten") Me.DataSet11.Klanten.AcceptChanges()
</code>

Deze wordt wel uitgevoerd zonder foutmeldingen maar komt niet in de database (Access) terecht.

Overigens is het updatecommand automatisch gegenereerd door de wizard. Dus wel degelijk aanwezig.

Iemand enig idee?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Je bent zeker dat je geen AcceptChanges aanroept voordat je de Update method van je DataAdapter aanroept?

Wat krijg je terug als je dit doet:
code:
1
2
DataSet ds = DataSet11.GetChanges();
MessageBox.Show (ds.Tables[0].Rows.Count.ToString());


Hoe ziet de UPDATE query eruit in je update-command?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Als ik bovenstaande aangepast toevoeg krijg ik:

system.nullreferenceexception: object reference not set to an instance of an object.

met volgende code:

ds = dsKlanten.GetChanges()
MsgBox(ds.Tables(0).Rows.Count.ToString())

Verder is de query de standaarquery die gegenereerd wordt door de wizard zelf:

UPDATE Klanten
SET Adres = ?, BTWnummer = ?, Fax = ?, Gemeente = ?, HR = ?, Naam = ?, Postcode = ?, Telefoon = ?
WHERE (Klantnummer = ?) AND (Adres = ? OR
? IS NULL AND Adres IS NULL) AND (BTWnummer = ? OR
? IS NULL AND BTWnummer IS NULL) AND (Fax = ? OR
? IS NULL AND Fax IS NULL) AND (Gemeente = ? OR
? IS NULL AND Gemeente IS NULL) AND (HR = ? OR
? IS NULL AND HR IS NULL) AND (Naam = ? OR
? IS NULL AND Naam IS NULL) AND (Postcode = ? OR
? IS NULL AND Postcode IS NULL) AND (Telefoon = ? OR
? IS NULL AND Telefoon IS NULL)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:50

gorgi_19

Kruimeltjes zijn weer op :9

offtopic:
Wat is het nu van het gedeelte na klantnummer in de where clausule ? Deze kan toch weggedonderd worden?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Verwijderd schreef op 16 april 2004 @ 13:51:
Als ik bovenstaande aangepast toevoeg krijg ik:

system.nullreferenceexception: object reference not set to an instance of an object.

met volgende code:

ds = dsKlanten.GetChanges()
MsgBox(ds.Tables(0).Rows.Count.ToString())
Dat wil dus zeggen dat die dataset die je terugkrijgt leeg is, wat dus wil zeggen dat dsKlanten geen wijzigingen bevat.
Ben je zeker dat je nog nergens AcceptChanges hebt aangeroepen op die dataset tussen het moment dat je de wijzigingen hebt aangebracht, en het moment dat je de Update method aanroept?
AcceptChanges zorgt er nl. voor dat de DataRowState op Unchanged gezet wordt.
Verder is de query de standaarquery die gegenereerd wordt door de wizard zelf:
Mjah, dat is dus eigenlijk een kutquery. IMO herschrijf je die beter zelf, zodanig dat de WHERE clausule enkel filtert op PK.
Die query ziet er natuurlijk zo uit ivm concurrency issues, maar toch is ie niet zo handig vind ik.

https://fgheysels.github.io/


Verwijderd

Topicstarter
gorgi_19 schreef op 16 april 2004 @ 13:54:
offtopic:
Wat is het nu van het gedeelte na klantnummer in de where clausule ? Deze kan toch weggedonderd worden?
Klopt ja... Waarom hij dat automatisch genereerd is voor mij ook een vraagteken maar jah...

Verwijderd

Topicstarter
Volledige code van het project:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
OleDbDataAdapter1.Fill(dsKlanten, "klanten")
End Sub

Private Sub cmdVolgende_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdVolgende.Click
Me.BindingContext(dsKlanten, "klanten").Position += 1
End Sub

Private Sub cmdVorige_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdVorige.Click
Me.BindingContext(dsKlanten, "klanten").Position -= 1
End Sub

Private Sub cmdOpslaan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOpslaan.Click
Dim strException As String

Dim ds As New DataSet

Try
MsgBox(Me.dsKlanten.Klanten(0).Naam)

ds = dsKlanten.GetChanges()
MsgBox(ds.Tables(0).Rows.Count.ToString())
Me.OleDbDataAdapter1.Update(dsKlanten, "Klanten")
Me.dsKlanten.Klanten.AcceptChanges()

MsgBox(Me.OleDbDataAdapter1.UpdateCommand.CommandText.ToString)
MsgBox(Me.OleDbDataAdapter1.DeleteCommand.CommandText.ToString)
MsgBox(Me.dsKlanten.Klanten(0).Naam)
Catch eX As Exception
MsgBox(eX.ToString, MsgBoxStyle.OKOnly, "Unable to apply change:")
End Try

End Sub

Private Sub cmdAfsluiten_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAfsluiten.Click
Me.OleDbDataAdapter1 = Nothing
Me.OleDbConnection1.Close()
End
End Sub
End Class

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Je kunt hier ook [code] tags gebruiken om je code te formatten hoor.
Het is wel niet de bedoeling natuurlijk dat je hier je volledige code post, zodat wij ze voor jou kunnen debuggen. ;)

Waar toon je die gegevens in ? Ik ga ervanuit dat die gegevens in textboxen getoond worden?
Wat doe je als je je gegevens aangepast hebt? Klik je dan meteen op 'save' ?

Roep eens de 'EndCurrentEdit' method op van je CurrencyManager voordat je de Update method van je dataadapter aanroept.
Er staat in de help dat je beter de EndEdit method aanroept van je DataTable ipv de EndCurrentEdit

[ Voor 24% gewijzigd door whoami op 16-04-2004 14:16 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Nu werkt dat inderdaad wel...

Waarvoor dient die Currencymanager dan wel? Want veel begrijpen doe ik niet...

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Je gebruikt die CurrencyManager al, dus dan mag ik hopen dat je wel weet wat hij doet?

CurrencyManager is de class die de databindings beheert van een bepaald data-object. De currency-manager weet bv. welk item er momenteel getoond wordt (welk item er actief is) [zie de position property]. Je DataTable weet dat nl. zelf niet.

Die EndEdit moest je oproepen omdat de rowstate anders niet naar 'changed' gaat; je row is nl. nog altijd de 'actieve' row, en pas als je naar een volgende row zou gaan , of door de EndEdit aan te roepen geef je aan dat de wijzigingen OK zijn.

https://fgheysels.github.io/


Verwijderd

Verwijderd schreef op 16 april 2004 @ 14:30:
Nu werkt dat inderdaad wel...

Waarvoor dient die Currencymanager dan wel? Want veel begrijpen doe ik niet...
dmv die CurrencyManager is het mogelijk om 'door je records heen te lopen' verder vuurt dat ding events als de record positie veranderd, handig als je bijv een record 10 van de 100 tekst wilt laten zien.

Nog even over die kutquery, bij de dataadapter wizard kun je instellen (onder advanced option knop) of je concurrency wilt gebruiken. Verder vind ik die query nog niet zo kut als je van optimistic concurrency gebruik wilt maken, alleen zou een optie met 1 extra datetime veld wel beter zijn hiervoor.

Verwijderd

Topicstarter
Ik gebruikte die niet... Vandaar mijn vraag.

Maar nu blijkt alles te werken.

Thanks voor de hulp!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Verwijderd schreef op 16 april 2004 @ 14:46:
Ik gebruikte die niet... Vandaar mijn vraag.

Maar nu blijkt alles te werken.

Thanks voor de hulp!
Hier maak je gebruik van de CurrencyManager:
code:
1
Me.BindingContext(dsKlanten, "klanten").Position -= 1

Check maar eens in de .NET help, en zoek eens op BindingContext. Die returned een BindingManagerBase en dat kan een CurrencyManager of een PropertyManager zijn.

https://fgheysels.github.io/

Pagina: 1