[C#] [OleDB] Insert en update

Pagina: 1
Acties:

  • *Dutch-Force*
  • Registratie: December 2001
  • Laatst online: 07-06-2024
Beste mensen,

Ik zit met een probleempje, ik ben met een "database manipulatie" classe bezig en nu heb ik een stukje code gemaakt dat aan de hand van een xml file en een datatable uit de database kijkt welke gegevens er al in de database zitten en dus geupdate moeten worden. En welke gegevens er nog niet inzitten en dus ge-insert moeten worden.

De te updaten rows komen en een datatable voor de updates. De insert rows komen in een insert datatable.
Ik maak gerbuik van een dataAdapter

Maar als ik nu een row probeer te updaten dan geeft ie de fout melding dat de Update functie van de adapter een geldig Insert commando nodig heeft om een nieuwe rij toe te voegen. dit is best raar want even daarvoor is bepaald dat de rij niet nieuw is.
Als ik dan vervolgens een Insert command erbij maak, en de Update functie van de adapter aanroep dan zegt ie dat ie de rij niet in de database kan stoppen omdat die er al inzit?

Weet iemand hoe OleDb bekijkt wanneer ie het update of insert command moet gebruiken, want zoals ik het zo zit snapt ie er nix van.

Thanx

ComputerSpecs


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Je moet ervoor zorgen dat je de row in je datatable opzoekt als je iets wil bewerken en een nieuwe row aan je datatable toevoegt zodra je een record wilt toevoegen. Die handeling moet je zelf uitvoeren. Verder is het best ingewikkeld om iets te zeggen zonder ook maar één letter code.

offtopic:
Kijk de volgende keer je post nog even na op spelfouten. Dit is bijna niet te lezen. Voorbeeldje:

"De te updaten rows komen en een datatable voor de updates en de insert ros komen in een insert datatable."

My personal website


  • *Dutch-Force*
  • Registratie: December 2001
  • Laatst online: 07-06-2024
Dus de Update methode van de dataAdapter snapt niet wanneer hij iets moet inserten of updaten als je vanuit een andere tabel de rows doorgeeft?

ComputerSpecs


Verwijderd

Ik maak uit je post op dat je het .NET framework wilt gebruiken. Daarnaast gebruikt je de term OleDB, wat in termen van .NET een stapje lager is, maar zeker niet slechter hoeft te zijn. Ook basale ADO kan XML lezen en werken met batch updates. Conflicten oplossen blijf je zelf doen, al geeft .NET meer kapstokken dan kale ADO. Altijd het afwegen waard.

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

De update methode snapt heel goed wanneer een update uitgevoerd moet worden en wanneer een record geinsert moet worden, als jij het goed aangeeft: als je wil aanpassen zoek je in de table die je wil aanpassen de te muteren rij op en pas je die aan, wanneer je een rij wil toevoegen add je een row van het type dat je in de betreffende table hebt staan.

Je kunt niet zeggen: "Dit is de table, deze rows heb ik en nou updaten maar!" om er vervolgens van uit te gaan dat de dataAdapter bestaande rijen aanpast en nieuwe rijen toevoegt, nee. Dat zul je, afaik, nog steeds zelf moeten doen.

offtopic:
Bloog: binnen .Net zit in de System.Data namespace toch gewoon de OleDb ondersteuning? Ik snap je opmerking daarom niet helemaal. Hoe wil je anders met bijvoorbeeld een Access database werken?

[ Voor 17% gewijzigd door OZ-Gump op 08-02-2005 13:53 ]

My personal website


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:29
Verwijderd schreef op dinsdag 08 februari 2005 @ 13:34:
Ik maak uit je post op dat je het .NET framework wilt gebruiken. Daarnaast gebruikt je de term OleDB, wat in termen van .NET een stapje lager is, maar zeker niet slechter hoeft te zijn. Ook basale ADO kan XML lezen en werken met batch updates. Conflicten oplossen blijf je zelf doen, al geeft .NET meer kapstokken dan kale ADO. Altijd het afwegen waard.
OleDb is gewoon een 'data-provider' in .NET, die je kan gebruiken voor vrijwel alle RDBMS'en.
Als je gebruik maakt van een sql server DB kan je wel beter de SqlClient provider gebruiker.

Een DataAdapter heeft wel een primary key nodig dacht ik, zodanig dat hij kan weten welke rows er nieuw zijn, en welke er geupdated moeten worden.
Zorg er dus voor dat je een PK hebt in je tabel, en dat je DataTable ook een PK heeft.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:29
Trouwens, voor zover ik het begrijp, is jouw situatie als volgt:

je hebt een datatable waarin je alle rows propt die ge-updated moeten worden
je hebt een datatable met daarin alle rows die ge-inserted moeten worden.

Echter, de DataAdapter gaat adhv de RowState property van een DataRow gaan kijken of de rij toegevoegd ('added') of gewijzigd is (modified). Adhv die property bepaalt de data-adapter of hij een insert of een update moet doen.
Als jij dus een rij (manueel) toevoegt aan een datatable, dan gaat de data-adapter die rij als 'nieuw' beschouwen en dus een insert willen doen.

Als jij je systeem zo wilt behouden zoals je nu hebt, dan kan je imo beter geen data-adapter gebruiken, maar zelf, iedere rij in de datatable met nieuwe records overlopen en een INSERT command toepassen voor iedere rij, en voor iedere rij in de tabel met te 'updaten' records een update command toepassen.

https://fgheysels.github.io/


Verwijderd

OZ-Gump schreef op dinsdag 08 februari 2005 @ 13:52:
(...)
Je kunt niet zeggen: "Dit is de table, deze rows heb ik en nou updaten maar!" om er vervolgens van uit te gaan dat de dataAdapter bestaande rijen aanpast en nieuwe rijen toevoegt, nee. Dat zul je, afaik, nog steeds zelf moeten doen.
(...)
Bij ADO werkt dit wel zo. Je geeft 2 tabellen, een error handler en synchen maar.

  • *Dutch-Force*
  • Registratie: December 2001
  • Laatst online: 07-06-2024
whoami schreef op dinsdag 08 februari 2005 @ 14:03:

Echter, de DataAdapter gaat adhv de RowState property van een DataRow gaan kijken of de rij toegevoegd ('added') of gewijzigd is (modified). Adhv die property bepaalt de data-adapter of hij een insert of een update moet doen.
Als jij dus een rij (manueel) toevoegt aan een datatable, dan gaat de data-adapter die rij als 'nieuw' beschouwen en dus een insert willen doen.
Kijk hier heb ik wat aan, ik wist niets precies wat de adapter gebruikte om te bepalen wanneer iets nieuw was.

Ik heb het nu op de volgende manier gedaan:

Bestaand record de datatable van de database aanpassen middels een changeRow functie die ik gemaakt heb. Een nieuw record wordt in de dataTable geimporteerd via de importRow functie van de table.

Bedankt voor de hulp.

ComputerSpecs

Pagina: 1