Toon posts:

[VB6] Probleem met updaten via ADO

Pagina: 1
Acties:

Verwijderd

Topicstarter
Dames en heren,

Ik zit met een serieus probleem en ik snap er geen moer van w'rom die het niet doet. Ik gebruik ADO, dus d.m.v. het ADODB object doe ik alles. Ik gebruik overigens een DNS less connectie via MySQLODBC. (Ik gebruik dus MySQL :D))

Ik krijg, wanneer ik ook maar een veld probeer te wijzigen de error: "Current recordset does not support updating. This may be a limitation of the provider, or of the selected locktype."

Ik krijg die error bij de volgende regel:

code:
1
2
        With rs
            !naam = txtBedrijfsnaam.Text

(enz.enz.enz)

Ik heb alles gedaan volgens 't boekje. De verschillende locktypes wijzigen heeft ook geen zin. Met de visual data manager heb ik dit probleem niet en mysqlfront ook niet. Help wie weet de oplossing??!?!?

[ Voor 3% gewijzigd door Verwijderd op 23-05-2003 16:20 ]


Verwijderd

Hoe open je je recordset?

Verwijderd

Topicstarter
Op de volgende manier:
code:
1
2
3
4
5
        Set rs = New ADODB.Recordset
        With rs
            .CursorLocation = adUseServer
            .Open "SELECT * FROM klant WHERE ID=" & ActieID, dbConnectie
        End With

Connectie komt overigens als volgt tot stand:

code:
1
2
3
4
5
    Set dbConnectie = New ADODB.Connection

    ' De connectie string. Wordt opgebouwd door de bovenstaande constanten
    dbConnectieString = "Driver={MySQL ODBC 3.51 Driver};Server=" & dbServerAdres & ";Database=" & dbDatabaseNaam & ";Uid=" & dbGebruikersnaam & ";" & dbWachtwoord
    dbConnectie.Open dbConnectieString

  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Je vergeet een adOpenDynamic-cursortype aan je connectiestring toe te voegen ;)
Aangezien er op de huidige manier een read-only recordset geopend wordt krijg je deze fout-melding.
ASP:
1
2
Con.CursorLocation = 2
RS.CursorType = adOpenDynamic

[ Voor 17% gewijzigd door DeverauX op 23-05-2003 16:24 ]

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


Verwijderd

Topicstarter
Nee ook dat werkt niet. Ik heb nu de volgende code:
code:
1
2
3
4
5
6
        Set rs = New ADODB.Recordset
        With rs
            .CursorLocation = adUseServer
            .CursorType = adOpenDynamic
            .Open "SELECT * FROM klant WHERE ID=" & ActieID, dbConnectie
        End With

Ik heb nog steeds hetzelfde probleem. Raar he?!?!?

Verwijderd

Misschien dit toevoegen:
code:
1
.LockType = adLockOptimistic

HTH :)

  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

"Current recordset does not support updating. This may be a limitation of the provider, or of the selected locktype."
/me En dan komt DeverauX met een cursortype aanzetten... :o

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


Verwijderd

Topicstarter
Lol nu krijg ik "Query-based update failed because the row to update could not be found." (reactie op die locktype optimistic, ik word eerder pesimistic :))

[ Voor 31% gewijzigd door Verwijderd op 23-05-2003 16:47 ]


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

WHERE ID=" & ActieID
Kans is groot dat dit de oorzaak is. Controleer eens of de variabele klopt :)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


Verwijderd

Is er wel een record gevonden met opgegeven ID dan?

Edit:
Overigens vraag ik me af waarom je 1 record met een recordset wil updaten, en niet met een update query. Dat zou nl. in deze situatie veel efficienter zijn.

[ Voor 63% gewijzigd door Verwijderd op 23-05-2003 16:50 ]


Verwijderd

Topicstarter
Jazeker. Want mijn scherm wordt gevuld met data uit die recordset. Dus dat is het niet :(

Verwijderd

Verwijderd schreef op 23 May 2003 @ 16:50:
Jazeker. Want mijn scherm wordt gevuld met data uit die recordset. Dus dat is het niet :(
Laat me raden: je toont alle records in een loop met .MoveNext, totdat je .EOF krijgt, en daarna probeer je te updaten? Misschien is dat een probleem, aangezien .EOF betekent dat er geen record meer is geselecteerd.

Verwijderd

Topicstarter
Neen ik krijg die error wanneer ik ".cursortype = adOpenDynamic" gebruik! Haal ik 't weg dan krijg ik de oude foutmelding weer terug. (Het gaat overigens om 1 record die ik ophaal door "where ID=" & ActieID.)

  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Neen ik krijg die error wanneer ik ".cursortype = adOpenDynamic" gebruik! Haal ik 't weg dan krijg ik de oude foutmelding weer terug.
Conclusie...? :)

Heb je die variabele die je in je query meegeeft nou al gecontroleerd?

[ Voor 6% gewijzigd door DeverauX op 23-05-2003 17:23 ]

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


Verwijderd

Topicstarter
Ja natuurlijk, die klopt als een bus dat is heel het probleem niet :(

Verwijderd

Topicstarter
He krijg nou wat. Als ik dit doe
code:
1
2
3
4
5
6
7
Set rs = New ADODB.Recordset
With rs
    .CursorLocation = adUseServer
    .CursorType = adOpenDynamic
    .LockType = adLockBatchOptimistic
    .Open "SELECT * FROM klant WHERE ID=" & ActieID, dbConnectie
End With


Dan kan ik de velden wel updaten als ik niets verander. Verander ik echter een waarde, dus wil ik (bijvoorbeeld) in veld "contactpersoon" de waarde veranderen, dan krijg ik een foutmelding, namelijk "Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done."

Heeeelp!?!?!

Verwijderd

Ik gebruik dit altijd; de gc zet ik in een aparte module en sluit deze als het programma afsluit; dan hoe je alleen de rs te coderen!

Hiermee moet het lukken

Code:
-----------------------------------------------------------------------------------
Dim rs as ADODB.Recordset
Dim gc as ADODB.Connection
Dim sqlString as string

'de connectie opzetten
Set gc = New ADODB.Connection
With gc
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\database.mdb;Persist Security Info=False;"
.CursorLocation = adUseClient
.Open (gc.ConnectionString)
End With

sqlString = "SELECT * FROM T0Openpolishouders " & "WHERE BedrijfID = " & idnummer & ";"

Set rs = New ADODB.Recordset
With rs
.CursorType = adOpenForwardOnly
.ActiveConnection = gc.ConnectionString
.LockType = adLockOptimistic
.Open sqlString, gc, , , adCmdText

'altijd afvragen of de record wel bestaat
If .RecordCount = 1 Then

!naam = naam
!adres = adres
!huisnummer = huisnummer
!postcode = postcode
!plaats = plaats
!contactpersoon = contactpersoon
!email = email
!aktief = aktief

.Update
End If

.Close
End With
Set rs = Nothing
-----------------------------------------------------------------------------------
Jij vergeet de activeConnection te gebruiken; ik weet niet wat jou connection met ..sql.. precies doet maar ik gebruik altijd "Microsoft.Jet.OLEDB.4.0"; werkt primá.

Succes!

[ Voor 12% gewijzigd door Verwijderd op 26-05-2003 10:45 ]


Verwijderd

Topicstarter
Bedankt voor je code maar helaas werkt 't niet. Ik heb het idee dat het met een compatbility probleem te maken heeft met MySQL en VB 6. Ik had iets gelezen over varchars en vb dat dat gewoon niet werkte. Ik heb ook al andere soorten tekst velden gebruikt maar dat was ook no go. Maar hoe moet ik nu in godsnaam velden wijzigen? Visual Data manager kan het toch ook?!?! (is tenslotte ook een vb applicatie)

Iemand nog suggesties??? Ik ga nu in ieder geval ff de code van visual data manager bekijken, misschien dat ik daar iets aan heb :)

Verwijderd

Wat voor fout geeft die dan; en met wat voor een database werkt jij? SQL?

Probeer dan gewoon een slq string:

UPDATE table_name
SET column_name = new_value
WHERE column_name = some_value

[ Voor 46% gewijzigd door Verwijderd op 26-05-2003 10:49 ]


Verwijderd

Topicstarter
Ik werk met MySQL. De update voer ik niet uit d.m.v. een SQL commando maar met

code:
1
2
3
with rs
  !blaat = "nieuwe tekst"
end with

stel, veld blaat bevat "oude tekst". verander ik de waarde van dit veld in "nieuwe tekst" dan krijg ik dus die nasty error. Ik heb dan nog niet eens een update of wat dan ook gedaan :s

Ik wil het graag zonder sql code doen omdat ik wanneer de form wordt geladen ik een lock zet op die specifieke record die word ge-update. Wanneer de gebruiker op ok drukt worden dus de velden geupdate met de nieuwe waarden.

Verwijderd

Hoe is jou activeConnection?

Ik begrijp trouwens nog steeds niet waarom je dan geen sql-statement kan maken;

Form_load --> locken van je record

Private sub cmdOk()
...bla bla bla...

sqlString = "UPDATE table_name " & _
"SET column_name = " & cstr(new_value) & _
"WHERE column_name = " & cstr(ID) & ";"

...bla bla bla...
end sub

Je klikt op een knop en dan de update uitvoeren volgens mij (kan aan mij liggen of aan jou uitleg) maakt het voor jou niet uit of je !update gebruikt of sql-update!?

s6

Verwijderd

Topicstarter
voor activeConnection zie hierboven. Ik heb de connectionstring in de thread al eens gegeven ;) Ok dat van die sql zou natuurlijk een oplossing kunnen zijn. Maar hoe lock ik 1 specifieke row in een table in mysql in form_load()?

Verwijderd

Volgens mij moet het lukken met
.LockType = adLockPessimistic

en heb jij
.ActiveConnection = gc.ConnectionString
in je recordset erbij staan?
Ik zie dat je wel de gc opent maar niet koppelt aan je recordset

[ Voor 19% gewijzigd door Verwijderd op 26-05-2003 11:24 ]


Verwijderd

Topicstarter
Ja inmiddels wel ja. Dus ik voor eerst rs.open bla bla bla uit zodat ik die ene regel uit de db heb. en vervolgens lock ik die handel en dan schrijf ik de update weg. recordset wordt gesloten en klaar is kees toch?

Verwijderd

op welke regel krijg je deze fout?

Kan je niet je HELE code geven; wordt misschien duidelijker

[ Voor 49% gewijzigd door Verwijderd op 26-05-2003 11:59 ]


Verwijderd

Topicstarter
Zie begin thread:
code:
1
2
With rs
   !naam = txtBedrijfsnaam.Text

overigens ook als ik het op andere velden probeer....

Verwijderd

Topicstarter
Ik het nu met sql update gedaan. Werkt uiteraard maar locken... ho maar... any suggestions? Ik wil 1 specifieke rij uit de db met mysql locken...

Verwijderd

ik bedoel de hele code met gc en rs

Verwijderd

Topicstarter
Nou je krijgt niet de heeeele code want da's te veel ;)
Ik hoef alleen maar te weten hoe je 1 regel uit die tabel locked, dus:

Dit komt uit die form waar het om gaat (die actie code staat voor een code watie moet doen, dus toevoegen of wijzigen, want ik herbruik die form:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
...
    If Actie = 2 Then
        Set Rs = New ADODB.Recordset
        With Rs
            .LockType = adLockPessimistic
            .Open "SELECT * FROM klant WHERE ID=" & ActieID, dbConnectie, , , adCmdText
        End With
        
        txtBedrijfsnaam.Text = Rs!naam
        txtBedrijfsnaam.SelStart = Len(txtBedrijfsnaam.Text)
        txtContactPersoon.Text = Rs!contactpersoon
        txtContactPersoon.SelStart = Len(txtContactPersoon.Text)
        txtAdres.Text = Rs!adres
        txtAdres.SelStart = Len(txtAdres.Text)
        txtPostcode.Text = Rs!postcode
        txtPostcode.SelStart = Len(txtPostcode.Text)
        txtWoonplaats.Text = Rs!woonplaats
        txtLand.Text = Rs!land
        txtTelefoonnr.Text = Rs!telefoonnummer
        txtBanknr.Text = Rs!banknummer
        txtDebnr.Text = Rs!debnummer
    End If


Dit komt uit een module:
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
Option Explicit

' Definieer publieke database objecten
Public dbConnectie As ADODB.Connection

' Database constanten, verander deze wanneer db mysql server andere gebruikersnaam of
' wachtwoord heeft gekregen
Public Const dbGebruikersnaam = "root"
Public Const dbWachtwoord = ""
Public Const dbServerAdres = "localhost"
Public Const dbDatabaseNaam = "EAS"

Public Sub dbOpenDatabase()
    Dim dbConnectieString As String
    
    On Error GoTo dbOpenDatabase_foutmelding
    
    Set dbConnectie = New ADODB.Connection

    ' De connectie string. Wordt opgebouwd door de bovenstaande constanten
    dbConnectieString = "Driver={MySQL ODBC 3.51 Driver};Server=" & dbServerAdres & ";Database=" & dbDatabaseNaam & ";Uid=" & dbGebruikersnaam & ";Option=16386"
    dbConnectie.CursorLocation = adUseServer
    dbConnectie.Open dbConnectieString
    Exit Sub
    
dbOpenDatabase_foutmelding:
    MsgBox "Kan geen verbinding maken met de databaseserver. Foutmelding van ODBC" & Chr(34) & Err.Description & Chr(34), vbCritical + vbOKOnly, "Database probleem"
End Sub

' Sluit workspace en connectie met database
Public Sub dbSluitDatabase()
    dbConnectie.Close
End Sub

Vervolgens wordt het dus weggeschreven:
code:
1
2
3
4
5
6
7
8
9
10
...
    If Actie = 2 Then   ' actiecode 2 is wijzigen
        ' maak wijzigingen en sluit recordset, als 't goed is word deze dan vanzelf
        ' geupdate
        dbConnectie.Execute "UPDATE klant SET naam='" & txtBedrijfsnaam.Text & "', adres='" & txtAdres.Text & "', postcode='" & txtPostcode.Text & "', woonplaats='" & txtWoonplaats.Text & "', land='" & txtLand.Text & "', telefoonnummer='" & txtTelefoonnr.Text & "',banknummer='" & txtBanknr.Text & "',debnummer='" & txtDebnr.Text & "',contactpersoon='" & txtContactPersoon.Text & "' WHERE ID = " & ActieID
        
        MsgBox "Gewijzigde klantgegevens opgeslagen.", vbInformation + vbOKOnly, "Klant gegevens"
    End If
    
    Unload Me
Pagina: 1