[asp.net] Locken van een database gegevens

Pagina: 1
Acties:

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
Ok je kent het probleem

Je hebt verschillende users die dezelfde data kunnen gaan aanpassen, dus kan het vookomen dat 2 personen met dezelfde gegeven bezig zijn en dan worden alleen de wijzigingen van de laatste persoon die een update heeft gedaan doorgevoerd.

Hoe kan ik dit op een makkelijke manier bijhouden, de webapplicatie in VB.Net is bijna klaar, dus all het updaten en inserten wordt uitgevoerd door 1 functie (je hoeft aleen een sql query op te geven).

Dus het zou makkelijk zijn als ik hier iets aan kan gaan wijzigen.
Maar ik weet niet of hier een oplossing voor is. Ik kan wel zelf wel een tabel gaan bijhouden als iemand gegevens gaat wijzigen (dan gaat die in editmodus) en dan kijken als iemand gaat updaten. Maar dat is niet een echt goede manier.

Ik heb een beetje lopen zoeken, maar ik vindt alleen maar informatie over wat het precies is (mutual exclusion) maar ik kan geen voorbeelden vinden over dit onderwerp.

Ik maak gebruik van een SQL2000 server, dus misschien kan het hier ook mee
hopelijk heeft iemand een oplossing liefst iets van asp.net

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:46
In .NET maak je gebruik van disconnected data. Je hebt dus als je data ophaalt en deze in een dataset inlaadt, een offline dataset. Als ik ook data ophaal dan heb ik ook een offline dataset.
Als jij nu wijzigingen aanbrengt, dan is dat op jouw dataset en als ik wijzigingen aanbreng, dan is dat op mijn dataset. Als ik dan ga gaan 'saven', dan worden mijn wijzigingen doorgevoerd, als jij daarna jouw wijzigingen wegschrijft, dan worden deze ook gesaved en eventueel worden de wijzigingen die ik aanbracht overschreven. (Als we dezelfde records hebben aangepast).

Althans, dat is wat ik er van begrepen heb.

https://fgheysels.github.io/


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Makkelijkst is om een timestamp veld in een tabel te creeeren en die mee te selecteren en terug te geven bij een update. Die check je dan eerst tegen het record dat dan in de DB staat. Is het gelijk dan update je en dan dus ook de timestamp. is het ongelijk dan heeft iemand anders geupdate ondertussen.

Je kan ook alle oude waarden meegeven aan de update en dan in je update procedure eerste de oude waarden ophalen met een select. Zijn deze waarden gelijk aan de meegegeven oude waarden, dan update je met de nieuwe waarde.

Timestamp is mooier, maar vergt een DB aanpassing.
Oude waarden meegegeven vereist caching aan de client kant van de oude waarden en aanpassing van je update API

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
whoami schreef op 19 november 2002 @ 15:54:

Althans, dat is wat ik er van begrepen heb.
Ja, dat klopt. Maar ik schrijf geen dataset terug. Ik heb een datagrid, als ik een rij selecteer dan wordt een panel gevuld met informatie die kun je aanpassen en zodra je dan op 'ok' drukt dan wordt er 1 sqlquery gemaakt die alleen de waarden uit de velden update.

Maar voor de rest klopt jou verhaal met de mijne

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
zo'n timestamp veld wordt die autmatisch geupdate zodra je iets aanpast?
Daar hoef je dan bij de update query's niks voor aan te passen?
Het is op zich wel een oplossing maar vergt wel veel aanpassing

Verwijderd

Misschien in een table bijhouden welke "open" zijn?

Als iemand dan tegelijk wil editten krijgt ie een melding "already open"

SqlString="SELECT * FROM OpenConnections WHERE con="&CHR(34)&ConnectionToBeOpened&CHR(34)
IF NOT rs.EOF THEN Response.Write "Already Open!"

zoiets misschien :?

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
Ik hou het liever bij een update, en niet bij een select. Dat beperkt de functionaliteit. Maar dat idee had ik zelf ook al bedacht zoals je hebt kunnen lezen.

Maar ik weet het niet zeker of dat wel een goede oplossing is

Verwijderd

Als je wilt voorkomen dat een andere gebruiker dezelfde data gaat editen, dan moet je de row locken in je SELECT statment. Zie bijvoorbeeld http://www.sql-server-per...tention_tamed_article.asp
Bij het updaten geef je tabel weer vrij.

Of deze link: http://www.databasejourna...mssql/article.php/1441321

[ Voor 0% gewijzigd door Verwijderd op 19-11-2002 17:02 . Reden: Link toevoegen ]


  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
Maar gaat die locks zoals je in dat document hebt kunnen lezen ook gelden voor Disconnected Data? zoals whoami het heeft uitgelegd.

Verwijderd

Hmm. Ik heb even gezocht met google groups en misschien is dit wel interessant:

I don't have time to go into details (an excellent
book to read is Bill Vaughn's "ADO Examples And Best Practices") but
here's an overall plan: When the user requests a record, open a
client-side disconnected recordset (set its ActiveConnection to
Nothing after it's opened) created from a stored procedure specifying
a batch update lock (adLockBatchOptimistic). Use the values in the
recordset to populate the unbound textboxes on your form. Update the
recordset when your user clicks the Save button on your form, then
reconnect it to the SQL Server (by setting its ActiveConnection
property to an open Connection object) and issue an UpdateBatch
command (you can resolve concurrency problems at this point by
checking the fields' UnderlyingValue property to their OriginalValue
property - these will be different if another user has updated the
record). If successful, let the user know.

(http://groups.google.com/...40news.charter.net&rnum=5)

Ik hoop dat je hier wat aan hebt.

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 28-08 13:52
Goodielover schreef op 19 November 2002 @ 16:00:

Je kan ook alle oude waarden meegeven aan de update en dan in je update procedure eerste de oude waarden ophalen met een select. Zijn deze waarden gelijk aan de meegegeven oude waarden, dan update je met de nieuwe waarde.
Als je in je app een SqlDataAdapter gebruikt om de data op te halen, kun je die ook gebruiken om de dataset weer op te slaan: dataSet.Update() (gokje, even uit 't hoofd). Hier hoef je dus zelf geen update-statement te bouwen.
Als je 't zo doet checkt ie volgens mij ook automatisch of de data nog steeds hetzelfde is als de data die in eerste instantie is opgehaald.
Tevens checkt ie of er uberhaupt wel iets aan de data gewijzigd is. Hij zal dus geen nutteloze updates doen.

  • tijn
  • Registratie: Februari 2000
  • Laatst online: 31-07 00:06
maikel schreef op 19 November 2002 @ 20:52:
[...]


Als je in je app een SqlDataAdapter gebruikt om de data op te halen, kun je die ook gebruiken om de dataset weer op te slaan: dataSet.Update() (gokje, even uit 't hoofd).
dataAdapter.Update(dataSet) :)
Hier hoef je dus zelf geen update-statement te bouwen.
Als je 't zo doet checkt ie volgens mij ook automatisch of de data nog steeds hetzelfde is als de data die in eerste instantie is opgehaald.
Tevens checkt ie of er uberhaupt wel iets aan de data gewijzigd is. Hij zal dus geen nutteloze updates doen.
De DataAdapter checkt alleen of de data nog steeds hetzelfde is wanneer dit in het update command zo gedefinieerd is. Ik geloof wel dat dit de default instelling is in VS.NET (als je de wizard gebruikt).

Cuyahoga .NET website framework


  • maikel
  • Registratie: Januari 2001
  • Laatst online: 28-08 13:52
tijn schreef op 19 november 2002 @ 22:04:
[...]

dataAdapter.Update(dataSet) :)
Inderdaad ja. |:(
[...]

De DataAdapter checkt alleen of de data nog steeds hetzelfde is wanneer dit in het update command zo gedefinieerd is. Ik geloof wel dat dit de default instelling is in VS.NET (als je de wizard gebruikt).
Volgens mij ook als je de wizard niet gebruikt.

Je kun van een DataSet of DataTable ook alle wijzigingen opvragen. Kan soms ook wel handig zijn, dan hoef ik je in ieder geval zelf niet meer vanalles te gaan vergelijken.

  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Wat ik in zo'n geval altijd doe, is het volgende.
Geef elke table en veld IsLocked (BIT) en update deze steeds naar TRUE wanneer iemand met de gegevens bezig is. Wanneer deze persoon een save actie doet, wordt het IsLocked veld weer op FALSE gezet, en mogen er dus andere mensen bij :)

Je moet er natuurlijk wel voor zorgen dat de Stored Procedure die je dataset ophaalt ook meteen de IsLocked velden van je opgehaalde records op TRUE zet.

Succes.

| Life is a game (and games are fun) | homepage |


Verwijderd

De oplossing is reeds gegeven, maak gebruik van timestamps.

Ik zal in het kort uitleggen waarom andere oplossingen minder elegant zijn.

Whoami heeft het juist als hij zegt dat indien je niets doet en gewoon een update statement naar buiten stuurt (met in where clausule de primary key) met de nieuwe veldwaarden, je het risico loopt dat aanpassingen van andere gebruikers overschreven worden. Dat is dus wat je zeker niet moet doen.

Volgende voorstel heeft ook zijn nadelen : In een table bijhouden welke open zijn (nesQuick). Als een gebruiker gaat pauzeren, kan gedurende die pauze niemand dat record updaten (of zelfs benaderen bij een exclusive lock!) en dat wil je uiteraard voorkomen. Hetzelfde geldt voor de row te locken. Binnen een transactie moet je nooit ofte nimmer een gebruikersinteractie toelaten (in dit geval wijzigen van data), want dat houdt de zaak onnodig op en de kans is reëel dat je andere gebruikers dwarsligt.

In een tabel bijhouden welke rijen van een tabel gelockt zijn door andere gebruiikers, is ook niet zo voordelig als men denkt. Indien de connectie verloren gaat (bijvoorbeeld doordat het netwerk uitvalt, of de gebruiker de applicatie afschiet of iets anders misgaat, worden die waarden nooit meer veranderd) hou je rijen vast, terwijl niemand daar daadwerkelijk iets aan het veranderen is. Voor die gevallen zul je zelfs een vrijgeefmechanisme moeten bouwen, want anders blijven die records tot in den eeuwigheid gelockt (Amen)

Bovenbeschreven oplossingen die het liefst voorkomen moeten worden, worden in de DB wereld beschreven als het pessimistic locking principe. Oke, het is een betere wijze dan helemaal geen locking principe toe te passen en gewoon maar alles lukraak te overschrijven, in de hoop dat niemand dat record reeds heeft aangepast. Maar dit pessimistic lockingprincipe heeft zo zijn nadelen (O.a. onnodig veel locks, waardoor het gevaar groter wordt dat andere gebruikers geblockt worden).

Bij pessimistic locking wordt er, om te voorkomen dat anderen dat record kunnen veranderen, een lock (mechanisme) geactiveerd, alvorens men daadwerkelijk gaat updaten. Echter, door het pessimistic locking mechanisme toe te passen, zorg je er dus voor dat andere gebruikers gedurende de locktijd dat record niet kunnen wijzigen, proberen ze het toch, dan worden zij geblockt, net zolang totdat jij je update weer vrijgeeft (Leuk als je even een uurtje pauze neemt).

En het lullige is, dat indien een ander dat record dan toch daarna update met in de where clausule alleen de primary key, dan ook het gevaar bestaat dat reeds gewijzigde gegevens overschreven worden.

Oke, er zijn mensen die zeggen dat ze in de where clausule alle veranderde velden (of alle) zetten en checken of de waarde nog gelijk is aan de oude waarde, maar dan moet je de oude waarden dus wel nog weten en bovendien hebben we dan geeneens een pessimistic lockingmechanisme nodig! (Je zult immers altijd moeten nagaan of er dan wel iets is geupdate, dus waarom lock je de zaak dan onnodig voor anderen)

Enfin, het komt er dus op neer dat je onnodige locks zoveel mogelijk wil voorkomen in een multi-user omgeving (100% voorkomen is in praktijk onmogelijk), want in het ergste geval kan dit weer leiden tot blocking of zelfs tot deadlock situaties!!

Wat is dan wel een goed mechanisme? Optimistic locking. Dat kan op twee manieren, ofwel je test tijdens de update of alle veranderde velden nog steeds de oude waarde hebben, ofwel je maakt gebruik van timestamps.

Persoonlijk ben ik er voorstander van timestamps te gebruiken. Een timestamp attribuut heeft namelijk de eigenschap van waarde te veranderen, zodra het record wordt gewijzigd. De where claulsule van het update statement moet bij optimistic locking toch al uitgebreid worden, dus het minste werk is dan een test te doen met een timestamp (1 extra check, t.o.v. n extra checks). uiteraard moet je dan wel je tabel voorzien van zo'n timestampattribuut.

Hoe gaat het in zijn werk? Tijdens het ophalen van je data haal je in dezelfde query ook per record het timestamp attribuut op. Indien je het mooi wil maken, kun je voordat je gaat wijzigen controleren of de timestamp van het te wijzigen record nog dezelfde waarde heeft. Is dat zo, dan heeft niemand dat record aangepast, zo nee dan kun je alsnog de laatste stand van zaken ophalen (inclusief timestamp attribuut) voor je gaat wijzigen.

Tijdens het bewaren, voeg je in de where clausule van je SQL statement de test van het timestamp attribuut toe (where primary_key = datte and timestamp_attribuut = ditte). Mocht er niets geupdate worden, dan weet je dat een ander reeds wijzigingen heeft aangebracht. Je zult dan in geen geval wijzigingen van andere gebruikers overschrijven en ook gebruikers niet onnodig blocken.

  • tijn
  • Registratie: Februari 2000
  • Laatst online: 31-07 00:06
Volgens mij ook als je de wizard niet gebruikt.

Je kun van een DataSet of DataTable ook alle wijzigingen opvragen. Kan soms ook wel handig zijn, dan hoef ik je in ieder geval zelf niet meer vanalles te gaan vergelijken.
De DataSet houdt inderdaad per rij in een DataTable bij of er wat veranderd is (uit te vragen met RowState). Maar hiermee ondervang je nog niet het concurrency probleem. Dit zal toch via de update query (UpdateCommand van je DataAdapter) gedaan moeten worden. In de gegenereerde code krijg je dan van die fijne dingen als:
code:
1
2
3
UPDATE tabel 
SET veld1=nieuw1, veld2=nieuw2, veld3=nieuw3
WHERE veld1=oud1 AND veld2=oud2 AND veld3=oud3

Ik vind het jammer dat ze niet (ook) een timestamp constructie bedacht hebben om het concurrency probleem te ondervangen.

Cuyahoga .NET website framework


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Dus bouw je die timestamp constructie zelf (zie mijn eerste post!!).
Gegenereerde code is vaak waardeloos. Je wilt in de where clause gewoon een update doen mbv de primary key. Als het record al verwijderd is door een andere gebruiker wil je toch een andere foutmelding kunnen geven dan wanneer die veranderd is door een andere gebruiker. Met zo'n update statement is het verschil tussen die twee situatie's niet te achterhalen.

Gewoon een timestamp inbouwen of alle waarden eerst weer selecteren uit de DB en dan vergelijken met de meegegeven oude waarden. Zijn de waarden niet gelijk, dan nette melding geven en in de (G)UI de mogelijkheid geven te refreshen.

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
Ja ik denk toch dat ik voor de TimeStamp ga, het kost me wel meer werk.

Ik heb bijna overal datagrid's, en die bevatten als source een dataview. Die moet je dan converteren naar een dataset, om via de update te kijken wat er zoal gebeurt is. En waar ik geen dataset heb gebruikt moet ik weer iets anders verzinnen.

Ik ga toch proberen overal met de timestamp te werken, zoals Goodielover al zij en het prachtige verhaal van jgkersemakers :)

Moet je dat timestamp veld in de DB zelf updaten en invullen tijdens een insert?
Ik hoop het niet, anders moet ik nog meer gaan aanpassen ;(
Edit
Dat hoeft dus gelukkig niet

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 28-08 13:52
tijn schreef op 20 November 2002 @ 08:49:
[...]

De DataSet houdt inderdaad per rij in een DataTable bij of er wat veranderd is (uit te vragen met RowState). Maar hiermee ondervang je nog niet het concurrency probleem. Dit zal toch via de update query (UpdateCommand van je DataAdapter) gedaan moeten worden. In de gegenereerde code krijg je dan van die fijne dingen als:
code:
1
2
3
UPDATE tabel 
SET veld1=nieuw1, veld2=nieuw2, veld3=nieuw3
WHERE veld1=oud1 AND veld2=oud2 AND veld3=oud3

Ik vind het jammer dat ze niet (ook) een timestamp constructie bedacht hebben om het concurrency probleem te ondervangen.
Ik zei ook niet dat je met die RowState het probleem ondervangt, maar het kan een handige extra 'feature' zijn.
En waarom zou er nog een timestamp-constructie in moeten dan ?
Checken of de gegevens niet gewijzigd lijkt mij voldoende hoor.

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
Hopelijk kan iemand me hier nog mee helpen

Die Timestamp is een binary veld, als ik die in een datagrid zet dan zie ik als tekst System.Byte[], en dit blijft overal zo, converteert de datagrid dat niet autmatisch? hoe moet ik hier dan mee omgaan

Verwijderd

dominion99 schreef op 20 november 2002 @ 11:05:
Hopelijk kan iemand me hier nog mee helpen

Die Timestamp is een binary veld, als ik die in een datagrid zet dan zie ik als tekst System.Byte[], en dit blijft overal zo, converteert de datagrid dat niet autmatisch? hoe moet ik hier dan mee omgaan
Het timestamp moet je niet laten zien. Dat veld moet je als het ware "onder water" gebruiken voor je update.

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
Ja maar ik wil het ook niet laten zien, maar ik wil het wel bij een select ophalen toch om bij het update te kijken of dat de timestamp niet verandert is

Ik weet niet anders waar ik die timestamp moet opslaan, dan bij de eigen rij

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:46
dominion99 schreef op 20 november 2002 @ 11:17:
Ja maar ik wil het ook niet laten zien, maar ik wil het wel bij een select ophalen toch om bij het update te kijken of dat de timestamp niet verandert is

Ik weet niet anders waar ik die timestamp moet opslaan, dan bij de eigen rij


Je kunt toch de column waar die timestamp in staat invisible maken?

https://fgheysels.github.io/


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

maikel schreef op 20 november 2002 @ 10:13:
[...]


En waarom zou er nog een timestamp-constructie in moeten dan ?
Checken of de gegevens niet gewijzigd lijkt mij voldoende hoor.
Als je niet alle gegevens van een record selecteert, maar slechts een deel, kan het record wel gewijzigd zijn, maar zie jij dat niet. Als dat niet zo erg zou zijn kan het altijd nog zijn dat bijvoorbeeld het een veld is die je wel in de where gebruikt. Als je de select nog een keer zou uitvoeren zou het record niet eens meer naar boven komen. (Denk bijv. aan een delete of status-vlag).
Timestamp werkt altijd.

Eventueel kan je ook de timestamp van het select statement gebruiken. Dus eerst een current-time selecteren op de DB en dan je normale select. Die select-time geef je dan terug bij een update. Als de timestamp van het record later is dan meegegeven selecttime, is je record niet mer geldig.
Voordeel is dat je geen bestaande selects hoeft aan te passen en ook geen time per record hoeft bij te houden, alleen dus per select waarop een update kan plaats vinden.
In elke update zet je wel direct de timestamp op current time.

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
whoami schreef op 20 november 2002 @ 11:33:

[...]


Je kunt toch de column waar die timestamp in staat invisible maken?
Ja maar daar ging het niet om, de dataset retouneert een byte(), deze kan een datagrid niet converteren dus komt er de stringwaarde system.byte[] te staan.

Ik heb nu een templatecolumn gemaakt, en doormiddel van een functie maak ik van die byte een string waarde.

Alleen nu is nog het probleem hoe ik de informatie vanuit een templatecolumn kan lezen, de string staat als tekst in een label

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
Ok dat heb ik gevonden, met de volgende code krijg ik de tekst in de templatecolumn
code:
1
2
3
4
5
6
Dim lb as Label
lb = CType(Item.Cells(12).Controls(1), Label)
Response.Write("Item12: " & lb.Text)

Edit: nog iets beter is
lb = CType(Item.FindControl("lblChange"), Label)


Ik heb nog iets heel anders, misschien is er een simpele oplossing voor.

Ik bouw mijn query string in 1 string variabele en koppel deze aan een SqlCommand

maar zodra ik apostrofjes in tekstvelden ga zetten dan werkt de hele string niet meer, dan krijg ik allerlei vage errors. Hoe kan ik dit verhelpen

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:46
In C#
code:
1
string sqltext = @"select * from tabel where naam = "whoami"";

of
code:
1
string sqltext = "select * from tabel where naam = \"whoami\"";

https://fgheysels.github.io/


  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
Als ik dat probeer in VB.NET
code:
1
& "','\" & memo & "\')"


En ik vul voor memo "pc's" in

dan krijg ik dit in mijn query string
code:
1
,'\pc's\');


(dit is maar een klein stukje van een insert statement)

Ik heb ook al geprobeerd om van te voren het ' teken te vervangen
met
code:
1
 memo.replace(" ' ", " \' ")

Zonder effect

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

kent vb.net niet zoiets als quotetext()

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:46
Ik weet niet hoe je het in VB.NET kunt oplossen, maar misschien kun je het wel zo doen:
code:
1
string s = 'select * from tabel where naam = 'pc''s'

https://fgheysels.github.io/


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 31-07 00:06
dominion99 schreef op 20 november 2002 @ 15:15:
Ik heb nog iets heel anders, misschien is er een simpele oplossing voor.

Ik bouw mijn query string in 1 string variabele en koppel deze aan een SqlCommand

maar zodra ik apostrofjes in tekstvelden ga zetten dan werkt de hele string niet meer, dan krijg ik allerlei vage errors. Hoe kan ik dit verhelpen
Je moet parameters gebruiken in icm je SqlCommand object.

Cuyahoga .NET website framework


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:46
tijn schreef op 20 November 2002 @ 15:54:
[...]

Je moet parameters gebruiken in icm je SqlCommand object.


Dat is natuurlijk idd de mooiste en de beste oplossing:
code:
1
2
3
4
5
string s = "select * from tabel where naam = @p_Naam";
SqlCommand cmdQuery = new SqlCommand();
cmdQuery.CommandText = s;
cmdQuery.Parameters.Add (....);
...

https://fgheysels.github.io/


  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
Ja, dat is natuurlijk beter. Daar heb je gelijk in. Helaas betekend dat ook een hoop aanpaswerk ;(

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
Nou ben ik dus met een SqlCommand bezig.

Nu loop ik tegen 1 probleem aan, en dat zijn NULL values
In mijn insert of update moet het zijn dat of het ene veld of het andere veld wordt geupdate.

Dit werkte voorheen wel gewoon een query string, maar hoe doe ik dit met de parameters

code:
1
2
3
4
5
6
7
Else If (PrintserverKoppel.Checked = true) Then
  Dim param1 As New SqlParameter("@pc_id", System.Data.SqlDbType.Int)
  param1.IsNullable = True
  sqlCommand.Parameters.Add(param1)
            
  sqlCommand.Parameters.Add("@printServer_id", System.Data.SqlDbType.Int).Value = printServer_id
End If


Ik dacht met de optie IsNullAble erbij moet het werken, maar zodra ik de update uitvoer dan krijg ik een foutmeldings
van dat hij variabele pc_id nodig heeft zonder dat hij aangegeven was.
Als ik een value bij de param geef dan werkt het wel, hoe kan ik er nou voor zorgen dat er null komt te staan in de DB.

Oja het is een integer veld, en in de DB mogen ze ook NULL zijn

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08-2025
Ok ik heb het gevonden, ik had het zelf al een keer getypt maar vergeten de .Value erachter te zetten
het moest dus zijn
code:
1
sqlCommand.Parameters.Add("@printServer_id", System.Data.SqlDbType.Int).Value = System.DBNull.Value
Pagina: 1