[C#] Connections, Transactions, probs bij saven

Pagina: 1
Acties:

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:50
Nog maar eens een .NET/C# probleem van mijnentwege. (Het 4de deze week?)

Deze keer heeft het, zoals je al uit de topic-title kunt uitmaken te maken met connections e.d., kortom, database perikelen.

Het probleem is als volgt:
Ik heb een form waarop je klantgegevens kunt ingeven. Deze gegevens moeten dan dmv een druk op de 'Applybutton' naar de databank weggeschreven worden.
Op die form staan een aantal TextBoxen (naam, adres, ...) en ook een ComboBox waar ik een gemeente uit kan selecteren.

Als ik nu m'n gegevens wil wegschrijven naar de databank krijg ik echter volgende error:
BeginTransaction requires an open and available Connection. The connection's current state is Open, Fetching.
Vreemd dacht ik, ik heb dan maar eens op bepaalde plaatsen wat code geschreven zodat ik een MessageBox kreeg die de status van m'n connectie toonde, en dat was iedere keer gewoon 'Open'. Van Fetching was er geen sprake.

Mijn eerste idee was dat het te maken had met het inladen van m'n combobox. Daar moeten nogal wat gegevens ingeladen worden en ik dacht dus dat hij die connectie misschien nog bezig was met daar gegevens te 'fetchen'. Ik heb m'n combobox dan maar eens niet ingeladen, maar ik kreeg dezelfde fout. Daar lag het dus al niet aan.

Vervolgens heb ik het dan maar geprobeerd om m'n connectie te sluiten en terug te openen vlak voor het saven, maar toen kreeg ik volgende foutmelding :
"The transaction object is not associated with the connection object
Dit terwijl er toch duidelijk in m'n code het volgende staat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void OnApplybuttonClick (object sender, EventArgs args)
{
  OleDbCommand qryPost;
  OleDbTransaction tx;

  qryPost  = new OleDbCommand();
  
  // Hier sluit en open ik m'n connectie om de eerste foutmelding te voorkomen
  MainForm.dbStd.Close();
  MainForm.dbStd.Open();

  qryPost.Connection = conn;
  tx = qryPost.BeginTransaction();   

  qryPost.Transaction = tx;   // Hier wordt het transaction object toegewezen aan m'n command

  // Hier komt dan het uitendelijke saven.

Wie heeft er een idee hoe het komt dat die connection-state plots 'fetching' is en hoe zou ik dit kunnen oplossen, zodat ik m'n connectie niet hoef te sluiten en opnieuw te openen. Dit zorgt toch maar voor onnodige overhead. Ik vermoed trouwens dat m'n 2de probleem (transaction object is not associated...) te maken heeft met het feit dat ik m'n connectie sluit en terug open.

https://fgheysels.github.io/


  • stylee
  • Registratie: December 2000
  • Laatst online: 04-09-2021

stylee

blah zeg ik je

Ok totaal een wilde gok hier.

Toen ik begon met databases in VB (niet .NET) had ik ongeveer hetzelfde probleem. Ik kon perfect gegevensa uit de db lezen, maar niet ernaar toe schrijven. Ik loste het op door een andere CursorSet te gebruiken.

Nou weet ik niet of ADO.NET ongeveer op dezelfde manier werkt (niks mee gedaan nog) en ook niet of dat verhaaltje van die cursors hier wel betrekking op heeft, maar je zou eens kunnen proberen in MSDN te zoeken op CursorSet en even een Client-side cursorset te gebruiken.

Succes

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:50
even kicken.

https://fgheysels.github.io/


Verwijderd

Connections moet je altijd meteen sluiten zodra je ze niet meer nodig hebt. Dat komt connectionpooling ten goede. ADO.NET gaat dan connections oppotten totdat er weer 1 nodig is.

Een connection openen maakt alleen een connectie met de database, wat je daarna doet is dus of 'fetchen' of 'updaten' of deleten of weet ik wat. Ik weet niet in hoeverre je data adapters gebruikt, maar wat ik er van begrepen heb, lijkt het me dat je de update/insert methods van de data-adapter kunt gebruiken voor het inserten/updaten van rows in je database. Die opent dan automatisch de opgegeven connection voor je.

Maar ik zou t.a.t. connections sluiten zodra je klaar bent met een connection.

edit:

wat je ook niet doet is het plaatsen van de transaction in een try-catch-finally block. Zodoende kun je niet op het juiste moment inspringen op fouten en dus meteen terugrollen. Databaseconnections open houden is veelal niet wat je wilt. Een actie op een database is in principe altijd: 1) Connection openen 2) transaction starten 3) acties uitvoeren 4) transaction committen 5) connection sluiten.

Ongetwijfeld heb je tutorials doorgewerkt, ik kwam net 1 tegen op gotdotnet mbt transactions en een stukje voorbeeldcode wat het goed illustreert. Wellicht overbodige kost, maar misschien ook niet:
http://samples.gotdotnet.com/quickstart/howto/doc/adoplus/DatabaseTrans.aspx

de complete howto pages: http://samples.gotdotnet.com/quickstart/howto/

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:50
Ik heb me dat al afgevraagd ivm die connections: Wat is er beter, 1x een connectie openen en die openhouden tot het einde van het programma of iedere keer een connectie openen als dat nodig is en dan idd gebruik maken van connection pooling. Ik zal hier eens wat verder onderzoek naar doen.

Over het gebruik van dat try/catch blok. Dit doe ik ook, het is alleen niet te zien in m'n code die ik hier gepost heb :)

Over het gebruik van DataAdapters: ik weet dat je mbhv data-adapters gemakkelijker gegevens kunt tonen/wegschrijven naar de db. Het is volgens mij zo'n beetje als de data-aware controls in Delphi/C++ Builder maar ik wil gewoon even alles uitproberen. Eens iets doen met data-adapters, eens iets doen zonder ...

Bedankt voor de informatie, ik zal ze dan eens doorspitten.

https://fgheysels.github.io/