Toon posts:

[.NET & ACCESS] Record vergrendeld na invoer lange string

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hey mensen, is ik weer! Met een probleem waar ik niet uit kom:

Ik heb een simpel formpje met daarin een teksteditor. De string wordt vanuit de editor netjes in de database geplopt. Dit doe ik in een memo veld (ACCESS DB), via een OleDb.OleDbType.LongVarWChar. Gaat allemaal helemaal goed.

Totdat ik dat record wil updaten. Het updaten van dat memo veld gaat op een gegeven moment niet. Als het een te lange string wordt gaat het fout. Ik krijg dan de melding dat het record vergrendeld is door een andere gebruiker. Maar er is geen andere gebruiker met het record bezig... Ik kan het record ook gewoon verwijderen?!

Ik heb al gekeken of het aan de string ligt o.i.d. maar dat is het niet. Of ik nou simpel html code in de database laat stoppen of alleen tekst... bij een update kan ik er niets meer mee omdat het record zogenaamd is vergrendeld?! Het openen van het record gaat overigens wel

  • whoami
  • Registratie: December 2000
  • Nu online
Note: One more important BUG (or feature whatever U call it) in OleDb.NET supplied with the .NET SDK beta2 is that than within a Ms Access column of the type 'Memo' you can only input some 4000 characters only! So if your message extends that limit a exception is thrown :(. The only solution is to use ODBC.NET, which can be downloaded from msdn.microsoft.com/net separately. ODBC.NET supplies a lot of left out features from OleDb.NET and is a MUST download.

https://fgheysels.github.io/


Verwijderd

Topicstarter
maar de INSERT gaat wel goed...., de update daarna niet meer

Verwijderd

Topicstarter
Ook met ODBC gaat het fout... dan krijg ik een soortgelijke melding:

ERROR [HY000] [Microsoft][ODBC Microsoft Access-stuurprogramma] Kan het bestand niet opslaan. Het wordt momenteel gebruikt door de gebruiker admin op PC-JEROEN en is vergrendeld

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 22:18

TeeDee

CQB 241

Heb je je Acces DB nog open in Acces zelf?

m.a.w., staat er een .ldb bestand?

[ Voor 37% gewijzigd door TeeDee op 22-03-2005 10:46 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


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

OZ-Gump

terug van weggeweest

En je hebt niet toevallig die database (of tabel) open staan in Access zodat je snel kunt zien of de juiste wijziging is doorgevoerd?
Sluit je de eerdere verbinding met de database wel netjes af?
Heb je een DAL geschreven of heb je de statements voor de database tussen de rest van de applicatielogica staan?

Misschien dat een beetje (relevante) code wat verduidelijking kan brengen....

My personal website


Verwijderd

Topicstarter
OZ-Gump schreef op dinsdag 22 maart 2005 @ 10:46:
En je hebt niet toevallig die database (of tabel) open staan in Access zodat je snel kunt zien of de juiste wijziging is doorgevoerd?
neen
OZ-Gump schreef op dinsdag 22 maart 2005 @ 10:46:
Sluit je de eerdere verbinding met de database wel netjes af?
ja
OZ-Gump schreef op dinsdag 22 maart 2005 @ 10:46:
Heb je een DAL geschreven of heb je de statements voor de database tussen de rest van de applicatielogica staan?
DAL?

Ik heb 3 aparte functies gemaakt voor het openen, toevoegen en updaten van records. Deze staan in de usercontrol waar mijn teksteditor in zit...

Maar de code, die lijkt mij goed, want als ik gewoon ff een testje doe werkt het wel met korte strings maar niet met lange :S

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Private Function UpdateSchedule(ByVal varScheduleID As Integer) As Boolean

        '----------------------------------------------------------------------------------------
        ' Het voorbereiden van een aantal strings voor de invoer in de database
        '----------------------------------------------------------------------------------------
        Dim intScheduleID As Integer = varScheduleID
        '----------------------------------------------------------------------------------------
        '----------------------------------------------------------------------------------------


        '----------------------------------------------------------------------------------------
        ' Haal de connectionstring op uit de globale variable strGlobalDbConn
        '----------------------------------------------------------------------------------------
        Dim OleDbConn As New OleDb.OleDbConnection(Global.strGlobalDbConn)
        '----------------------------------------------------------------------------------------
        '----------------------------------------------------------------------------------------


        '----------------------------------------------------------------------------------------
        ' Maak een OleDbCmnd en een string om de gegevens van de schedule in de database te updaten
        '----------------------------------------------------------------------------------------
        Dim OleDbCmnd1 As OleDb.OleDbCommand
        Dim strSQLCmnd1 As String
        strSQLCmnd1 = " UPDATE Tbl_Schedule SET " & _
                      " ScheduleUpdate = @ScheduleUpdate, " & _
                      " ScheduleNaam = @ScheduleNaam, " & _
                      " ScheduleEindDatum = @ScheduleEindDatum, " & _
                      " ScheduleContent = @ScheduleContent, " & _
                      " ScheduleActief = @ScheduleActief " & _
                      " WHERE ScheduleID = @ScheduleID"


        OleDbCmnd1 = New OleDb.OleDbCommand(strSQLCmnd1, OleDbConn)

        OleDbCmnd1.Parameters.Add("@ScheduleUpdate", OleDb.OleDbType.Date).Value = Now()
        OleDbCmnd1.Parameters.Add("@ScheduleNaam", OleDb.OleDbType.LongVarWChar).Value = txtScheduleNaam.Text
        OleDbCmnd1.Parameters.Add("@ScheduleEindDatum", OleDb.OleDbType.Date).Value = Convert.ToDateTime(txtScheduleEindDatum.Text)
        OleDbCmnd1.Parameters.Add("@ScheduleContent", OleDb.OleDbType.LongVarWChar).Value = txtScheduleContent.Text
        OleDbCmnd1.Parameters.Add("@ScheduleActief", OleDb.OleDbType.Boolean).Value = chkScheduleActief.Checked
        OleDbCmnd1.Parameters.Add("@ScheduleID", OleDb.OleDbType.Integer).Value = intScheduleID
        '----------------------------------------------------------------------------------------
        '----------------------------------------------------------------------------------------


        '----------------------------------------------------------------------------------------
        ' Om te voorkomen dat een user een foutmelding krijgt bij een database fout, doe een
        ' Try. Als er iets fout gaat komt er een popup met daarin de informatie! En er
        ' wordt een False geretourneerd.
        '----------------------------------------------------------------------------------------
        Try
            ' open de verbinding - voeg de schedule toe - haal het id op van de nieuwe schedule
            OleDbConn.Open()
            OleDbCmnd1.ExecuteNonQuery()
            Return True
            ' sluit de verbinding
            OleDbConn.Close()
        Catch Ex As Exception

            Response.Write("<script>alert('Fout bij update')</script>")

            ' Return een False omdat er een fout is opgetreden
            Return False
        End Try

    End Function

[ Voor 23% gewijzigd door Verwijderd op 22-03-2005 13:27 . Reden: verkeerde functie als code voorbeeld gegeven ]


  • whoami
  • Registratie: December 2000
  • Nu online
Vraagje, waarom doe je ExecuteNonQuery en direct daarna ExecuteReader :?

Trouwens, dat is de code voor het openen, niet voor het updaten.

Het sluiten van je connectie doe je trouwens beter in het finally block , ipv in de try zelf.
Als er nl. een exceptie optreedt voordat je jouw connectie hebt gesloten, dan blijft ze openstaan.
Als je die conn.Close in een finally block zet, dan ben je zeker dat ze altijd gesloten wordt.

[ Voor 52% gewijzigd door whoami op 22-03-2005 13:28 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Overigens, als ik na het toevoegen van de code in ACCESS zelf het veld wil bewerken, is deze ook geblokkeerd... Ik kan de andere velden van het record wel bewerken, maar niet degene waar de lange string in terecht komt

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:52

gorgi_19

Kruimeltjes zijn weer op :9

En hij zal de verbinding ook niet sluiten, aangezien je voor het sluiten al uit de method springt en hij de close dus nooit zal halen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Hmm ok dan was het dus toch die verbinding die niet goed afgesloten wordt. Vreemd dat het alleen foutmeldingen oplevert bij lange strings!
whoami schreef op dinsdag 22 maart 2005 @ 13:27:
Vraagje, waarom doe je ExecuteNonQuery en direct daarna ExecuteReader :?
Dat gebruik ik om het ID van het ingevoerde record op te halen, kan dit ook anders dan?!

ik doe het nu dus zo:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
strSQLCmnd2 = "SELECT @@Identity"

        OleDbCmnd2 = New OleDb.OleDbCommand(strSQLCmnd2, OleDbConn)

        Try
            ' open de verbinding - voeg de klant toe - haal het id op van de nieuwe klant
            OleDbConn.Open()
            OleDbCmnd1.ExecuteNonQuery()
            OleDbReader = OleDbCmnd2.ExecuteReader

            While OleDbReader.Read()
                ' Return het id
                Return CType(OleDbReader.Item(0), Integer)
            End While
Pagina: 1