[c#] Probleem update statement

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Erik888
  • Registratie: Augustus 2004
  • Laatst online: 31-10-2023
Ik heb een programma dat de ledenadminstratie bijhoudt in een access database. Ik heb de volgende code:

<code language=C#>
query = "SELECT * FROM leden";
dAdapterLeden = new OleDbDataAdapter(query, connString);
OleDbCommandBuilder cBuilderLeden = new OleDbCommandBuilder(dAdapterLeden);
dAdapterLeden.DeleteCommand = cBuilderLeden.GetDeleteCommand();
dAdapterLeden.InsertCommand = cBuilderLeden.GetInsertCommand();
dAdapterLeden.UpdateCommand = cBuilderLeden.GetUpdateCommand();
dTableLeden = new DataTable();
dAdapterLeden.Fill(dTableLeden);
dataGridLeden.DataSource = dTableLeden;

</code>

Als ik in de commandtext van het updatecommand kijk dan zie ik het volgende:
UPDATE leden SET NBB_nummer = ?, Voornaam = ?, Tussen = ?, Achternaam = ?, Adres = ?, Postcode = ?, Plaats = ?, Telefoonnummer = ?, Mobiel = ?, Geb_datum = ?, Lid_sinds = ?, Team = ?, Bankspeler = ?, E-mailadres = ?, Scheidsrechter = ?, Zaalwacht = ?, Tafel = ?, Scorer = ?, Vervoer = ?, Bondscheidsrechter = ?, Taken = ?, Taken_zaalwacht = ?, Zoeknaam = ? WHERE (((? = 1 AND NBB_nummer IS NULL) OR (NBB_nummer = ?)) AND ((? = 1 AND Voornaam IS NULL) OR (Voornaam = ?)) AND ((? = 1 AND Tussen IS NULL) OR (Tussen = ?)) AND ((? = 1 AND Achternaam IS NULL) OR (Achternaam = ?)) AND ((? = 1 AND Adres IS NULL) OR (Adres = ?)) AND ((? = 1 AND Postcode IS NULL) OR (Postcode = ?)) AND ((? = 1 AND Plaats IS NULL) OR (Plaats = ?)) AND ((? = 1 AND Telefoonnummer IS NULL) OR (Telefoonnummer = ?)) AND ((? = 1 AND Mobiel IS NULL) OR (Mobiel = ?)) AND ((? = 1 AND Geb_datum IS NULL) OR (Geb_datum = ?)) AND ((? = 1 AND Lid_sinds IS NULL) OR (Lid_sinds = ?)) AND ((? = 1 AND Team IS NULL) OR (Team = ?)) AND ((? = 1 AND Bankspeler IS NULL) OR (Bankspeler = ?)) AND ((? = 1 AND E-mailadres IS NULL) OR (E-mailadres = ?)) AND ((? = 1 AND Scheidsrechter IS NULL) OR (Scheidsrechter = ?)) AND ((? = 1 AND Zaalwacht IS NULL) OR (Zaalwacht = ?)) AND ((? = 1 AND Tafel IS NULL) OR (Tafel = ?)) AND ((? = 1 AND Scorer IS NULL) OR (Scorer = ?)) AND ((? = 1 AND Vervoer IS NULL) OR (Vervoer = ?)) AND ((? = 1 AND Bondscheidsrechter IS NULL) OR (Bondscheidsrechter = ?)) AND ((? = 1 AND Taken IS NULL) OR (Taken = ?)) AND ((? = 1 AND Taken_zaalwacht IS NULL) OR (Taken_zaalwacht = ?)) AND ((? = 1 AND Zoeknaam IS NULL) OR (Zoeknaam = ?)))

Als ik een lid wijzig met dAdapterLeden.Update(dTableLeden). Hierbij krijg ik foutmelding "syntax error in UPDATE statement".

Als ik het update statement zelf maak krijg ik de foutmleding "Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.".
dAdapterLeden.UpdateCommand = new OleDbCommand("UPDATE leden SET [NBB_nummer] = @NBB_nummer, [Voornaam] = @Voornaam, [Tussen] = @Tussen, " +
"[Achternaam] = @Achternaam, [Adres] = @Adres, [Postcode] = @Postcode, [Plaats] = @Plaats, [Telefoonnummer] = @Telefoonnummer, " +
"[Mobiel] = @Mobiel, [Geb_datum] = @Gebdatum, [Lid_sinds] = @Lidsinds, [Team] = @Team, [Bankspeler] = @Bankspeler, " +
"[E-mailadres] = @Emailadres, [Scheidsrechter] = @Scheidsrechter, [Zaalwacht] = @Zaalwacht, [Tafel] = @Tafel, [Scorer] = @Scorer, " +
"[Vervoer] = @Vervoer, [Bondscheidsrechter] = @Bondscheidsrechter, [Taken] = @Taken, [Taken_zaalwacht] = @Takenzaalwacht " +
"WHERE [Zoeknaam] = @Zoeknaam");
dAdapterLeden.UpdateCommand.Parameters.Add("@NBB_nummer", OleDbType.Integer, 5, "NBB_nummer");
dAdapterLeden.UpdateCommand.Parameters.Add("@Voornaam", OleDbType.Char, 50, "Voornaam");
dAdapterLeden.UpdateCommand.Parameters.Add("@Tussen", OleDbType.Char, 15, "Tussen");
dAdapterLeden.UpdateCommand.Parameters.Add("@Achternaam", OleDbType.Char, 50, "Achternaam");
dAdapterLeden.UpdateCommand.Parameters.Add("@Adres", OleDbType.Char, 255, "Adres");
dAdapterLeden.UpdateCommand.Parameters.Add("@Postcode", OleDbType.Char, 20, "Postcode");
dAdapterLeden.UpdateCommand.Parameters.Add("@Plaats", OleDbType.Char, 50, "Plaats");
dAdapterLeden.UpdateCommand.Parameters.Add("@Telefoonnummer", OleDbType.Char, 15, "Telefoonnummer");
dAdapterLeden.UpdateCommand.Parameters.Add("@Mobiel", OleDbType.Char, 15, "Mobiel");
dAdapterLeden.UpdateCommand.Parameters.Add("@Gebdatum", OleDbType.DBDate, 22, "Geb_datum");
dAdapterLeden.UpdateCommand.Parameters.Add("@Lidsinds", OleDbType.DBDate, 22, "Lid_sinds");
dAdapterLeden.UpdateCommand.Parameters.Add("@Team", OleDbType.Char, 4, "Team");
dAdapterLeden.UpdateCommand.Parameters.Add("@Bankspeler", OleDbType.Char, 4, "Bankspeler");
dAdapterLeden.UpdateCommand.Parameters.Add("@Emailadres", OleDbType.Char, 60, "E-mailadres");
dAdapterLeden.UpdateCommand.Parameters.Add("@Scheidsrechter", OleDbType.Boolean, 1, "Scheidsrechter");
dAdapterLeden.UpdateCommand.Parameters.Add("@Zaalwacht", OleDbType.Boolean, 1, "Zaalwacht");
dAdapterLeden.UpdateCommand.Parameters.Add("@Tafel", OleDbType.Boolean, 1, "Tafel");
dAdapterLeden.UpdateCommand.Parameters.Add("@Scorer", OleDbType.Boolean, 1, "Scorer");
dAdapterLeden.UpdateCommand.Parameters.Add("@Vervoer", OleDbType.Boolean, 1, "Vervoer");
dAdapterLeden.UpdateCommand.Parameters.Add("@Bondscheidsrechter", OleDbType.Boolean, 1, "Bondscheidsrechter");
dAdapterLeden.UpdateCommand.Parameters.Add("@Taken", OleDbType.Integer, 5, "Taken");
dAdapterLeden.UpdateCommand.Parameters.Add("@Takenzaalwacht", OleDbType.Integer, 5, "Taken_zaalwacht");
dAdapterLeden.UpdateCommand.Parameters.Add("@Zoeknaam", OleDbType.Char, 115, "Zoeknaam");

Als ik zelf voor de delete het command samenstel, gaat het onderstaande goed. Als ik "[Adres] is null" weglaat dan gaat het mis als ik een lid verwijder als het adres leeg is. Ik krijg dan weer de foutmelding "Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.".
dAdapterLeden.DeleteCommand = new OleDbCommand("DELETE FROM leden WHERE [Zoeknaam] = @Zoeknaam AND ([Adres] = @Adres or [Adres] is null)");
dAdapterLeden.DeleteCommand.Parameters.Add("@Zoeknaam", OleDbType.Char, 115, "Zoeknaam");
dAdapterLeden.DeleteCommand.Parameters.Add("@Adres", OleDbType.Char, 255, "Adres");

Iemand een idee wat hier het probleem is?
Iemand een idee wat de beste manier is om update-, insert- en deletecommands te maken?

Groet, Erik

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 13:23
Erik888 schreef op dinsdag 11 maart 2008 @ 09:02:
Iemand een idee wat hier het probleem is?
Iemand een idee wat de beste manier is om update-, insert- en deletecommands te maken?

Groet, Erik
Als je een syntax error krijgt, moet je eens zien hoe je statement er uit ziet. Dat kan je doen door de boel eens te printen naar de console bv.

Als je een concurrency violation krijgt, wil dat dat geen enkel record aangepast werd, omdat het door iemand anders reeds aangepast werd.
Echter, dat zal in dit geval niet zo zijn (dat je record al door iemand anders aangepast werd). Je krijgt een concurrency violation omdat je WHERE statement niet alleen op ID checked, maar ook op alle andere velden. Als je dat doet, dan moet je aan die andere parameters in je WHERE clause checken op de waardes die die velden hadden voor je wijziging; op de waardes dus die die velden hadden toen je het record opgehaald had.
Als je optimistic concurrency wilt implementeren, is het echter beter dat je gebruik maakt van een timestamp, zodanig dat je op die timestamp kunt checken in je where, ipv op alle andere velden van het record.

Verder: gebruik code-tags als je code post, want zo is het niet leesbaar.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Een concurrency foutmelding betekend dat tussen het moment dat je de gegevens hebt opgehaald en deze gegevens wil updaten naar de database, iemand anders al een wijziging heeft gedaan.

Het update gedeelte (set ...) bevat de nieuwe waardes en de where bevat de gegevens zoals opgehaald uit de database.

Je krijgt dan een update query als 'update users set lastname='smith', initials='j.' where lastname='smith' and initials='m.'
Als iemand M. al eerder wijzigt naar iets anders, dan zal het resultaat van de update query dus 0 gewijzigde records zijn. En dat houd in principe in, dat het record al eerder buiten jouw om is gewijzigd.


Je zou eventueel de concurrency check kunnen uitzetten, maar beter probeer je te achterhalen waarom het resultaat van de update query '0' blijft. Want dat zorgt ervoor dat de ConcurrencyException wordt geraised.

If it isn't broken, fix it until it is..