Toon posts:

[VBA/Access] Foutmelding koppeling VB en Access *

Pagina: 1
Acties:
  • 301 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb van een site al een tutorial gehaald over hoe VB met Acces te koppelen. Nu heb ik precies gedaan zoals het erin stond maar krijg als nog bij de volgende regel een foutmelding :

RECSET.Open "UPDATE Test SET Naam = '" & Text1.Text & "',Geboortedatum = '" & Text2.Text & "',Telefoonnummerthuis = '" & Text3.Text & "',Telefoonnummerwerk = '" & Text4.Text & "',Mobieletelefoon = '" & Text5.Text & "',email = '" & Text6.Text & "', Opmerking = '" & Text7.Text & "' WHERE Id=" & CDbl(Label9.Caption), DBCON

de foutmelding die ik krijg is : Runtime error '13'
Type mismatch

En bij DELETE krijg ik precies hetzelfde (delete staat dan ipv UPDATE)

Ik hoop dat jullie me kunnen helpen

Alle bestanden die ik gebruik bij het programmaatje kun je eventueel opvragen bij mij

[ Voor 18% gewijzigd door whoami op 02-12-2003 13:48 ]


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

gorgi_19

Kruimeltjes zijn weer op :9

En wat is de geparsde versie van je SQL Statement?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
ik gebruik verder geen SQl, heb in Acces een kleine database gemaakt, en probeer met VB gegevens in te voeren, inlezen, bewerken en verwijderen. de eerste 2 gaan prima, maar bewerken en verwijderen willen niet lukken

  • whoami
  • Registratie: December 2000
  • Nu online
Je gebruikt wel SQL.

Dat UPDATE statement, en dat DELETE statement is SQL. Je zou -zoals gorgi al oppert- je SQL statement eens naar het scherm kunnen laten printen, en dan goed nagaan of je nergens een komma, een quote, ... vergeten bent (en ook kijken of je niet teveel quotes hebt enzo).

Trouwens, als je je UPDATE statement door een DELETE wilt vervangen, moet je wel wat meer vervangen dan enkel UPDATE door DELETE. DELETE kent nl. geen SET clausule.

[ Voor 23% gewijzigd door whoami op 02-12-2003 13:38 ]

https://fgheysels.github.io/


  • IceM
  • Registratie: Juni 2003
  • Laatst online: 17:26
Euhm, sql is de taal waarmee je de database (acces dus) aanspreekt. Structured Query Language (zal wel weer niet goed geschreven zijn :))

Dus wat hij bedoelt is hoe je query eruit ziet met alle geparsde variabelen.

...


Verwijderd

Topicstarter
dit is de delete regel :

RECSET.Open "DELETE FROM test WHERE Naam=" & Label9.Caption, DBCON

  • whoami
  • Registratie: December 2000
  • Nu online
Als je een SELECT SQL statement gebruikt, kan je idd de Open method gebruiken.
Echter, als je een UPDATE/DELETE/INSERT doet, open je geen recordset, maar voer je een SQL statement uit. Je zult daarvoor dus een andere method moeten gebruiken ipv die Open (en voor zover ik weet voer je die andere method dan ook niet uit op een recordset).

Daarbij komt nog dat naam waarschijnlijk een alfanumeriek veld is, en je dus quotes rond naam moet zetten:
code:
1
"DELETE FROM tabel WHERE naam = '" & naam & "'"

[ Voor 21% gewijzigd door whoami op 02-12-2003 13:46 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
weer runtime error

Nu met de melding : The connection cannot be used to perform this operation, It is either closed or invalid for this context

en de database staat wel open

  • whoami
  • Registratie: December 2000
  • Nu online
Misschien moet je maar eens nog een andere tutorial ofzo opdiepen ipv met 'trial en error' te gaan prutsen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ben nu ook overal aan het zoeken, maar ik heb je 1e oplossing geprobeerd whaomi : de SQL statement naar een textbox te printen en daarin komt gewoon de goeie SQL statement te staan : Delete FROM test WHERE Naam = 1

mij op school hebben ze geleerd dat dat een goed SQL statement is

  • whoami
  • Registratie: December 2000
  • Nu online
Is naam een textveld, of een numeriek veld?
Als naam een numeriek veld is, dan is het idd een goed sql statement, en zal de fout veroorzaakt worden door de manier waarop je dat SQL aanroept denk ik.

https://fgheysels.github.io/


Verwijderd

Topicstarter
ik heb alleen maar textvelden, ik maak er nu een numeriek veld van kijken wat ie dan doet

Verwijderd

Topicstarter
dan loopt het al bij een andere sub vast die eerst wel gewoon goed ging

Verwijderd

Ik zou zelf zo iets doen

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Dim strSQL
strSQL = "SELECT * FROM Test WHERE Id = '" & CDbl(Label9.Caption) & "'"

RECSET.Open strSQL, DBCON, , 3
RECSET.Fields("Naam") = Text1.Text
RECSET.Fields("Geboortedatum") = Text2.Text
RECSET.Fields("Telefoonnummerthuis") = Text3.Text
RECSET.Fields("Telefoonnummerwerk") = Text4.Text
RECSET.Fields("Mobieletelefoon") = Text5.Text
RECSET.Fields("email") = Text6.Text
RECSET.Fields("Opmerking") = Text7.Text
RECSET.Update
RECSET.Close


Ten eerste omdat het overzichterlijker is
ten tweede omdat je nu beter foutmelding krijgt

en wat je probleem waarschijnlijk is is het geboortedatum feld aangezien je waarschijnlijk in je database er een DateTime veld van heb gemaakt dus zal je de Text2.Text eerst moeten converteren naar een date time formaat

Bijvoorbeeld met :
CDate(Text2.Text)

en dan word het in het voorbeeld
RECSET.Fields("Geboortedatum") = CDate(Text2.Text)

mischien help het wat ?

  • whoami
  • Registratie: December 2000
  • Nu online
AFAIK is die AddNew syntax traag, en het is ook niet flexibel. Als je select statement gegevens haalt uit meer dan 1 tabel, dan werkt het al niet meer.

https://fgheysels.github.io/


Verwijderd

je Delete statement word dan als volgt

code:
1
2
3
4
5
Dim strSQL

strSQL = "DELETE FROM test WHERE Naam = '" & Label9.Caption & "'"
RECSET.Open strSQL, DBCON, , 3
RECSET.Close


veel plezier er mee

Verwijderd

whoami

de AddNew is erg flexiebel en je voorkomt er meteen een hoop problemen mee

en daarbij als je in meerdere tabelen wat wil wijzigen kan je gewoon een SQL statement maken met een Join er in en geen probleem

je moet er natuurlijk wel voor zorgen dat je wel alle verlden mee neemt uit elke tabel die gevult moeten worden

maar probeer het maar is met een SELECT * FROM Test LEFT JOIN Test2 ON test1.col1 = test2.col1

Veel plezier er maar weer mee

Verwijderd

Topicstarter
HolyBrain

Ik heb allebei je oplossingen geprobeerd, maar krijg bij beide dezelfde foutmeldingen, die hierboven ook al genoemd is :

Runtime error '3709'

This connection cannot be used to perform this operation, It is either closed or invalid for this context

en als je dan debug komt de volgende regel in geheel in het geel te staan


RECSET.Open strSQL, DBCON, , 3

Verwijderd

O geef is de voledige code die je hebt
waarschijnlijk gaat je DataBase Connectie string fout maar als je me ff de hele code paast dan kan ik er ff naar kijken

Verwijderd

Topicstarter
Hele lap tekst. succes ermee


Option Explicit
Dim DBCON 'Staat voor Database Connectie, je mag ook andere var. gebruiken
Dim RECSET 'Staat voor RecordSet
Dim RB 'Mij eigen var.

Sub OpenDB()
Set DBCON = CreateObject("ADODB.Connection")
DBCON.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & ("E:\Jeroen\School\4e jaar\PKA\test.mdb") & ";"
End Sub

Private Sub Command1_Click()
If Text1.Text <> vbNullString And Text1.Text <> "" Then 'Kijk eerst of de textboxen gevuld zijn
Call OpenDB ' Maak de database connectie
RB = "SELECT * FROM test where trim(Naam) = '" & Trim(Text1.Text) & "'" 'kijk of de naam al bestaat
Set RECSET = DBCON.Execute(RB)

If Not RECSET.EOF Then ' Als ie de naam al voor het einde van de kolom "Naam" heeft gevonden…
DBCON.Close ' Sluit de database
MsgBox "Naam bestaat al in de database!" 'weergeef een messagebox
Else
DBCON.Close ' Sluit de database ga verder…
RB = ""
RB = "Insert into test(Naam,Geboortedatum,Telefoonnummerthuis,Telefoonnummerwerk,Mobieletelefoon,email,Opmerking) values ('" + Text1.Text + "','" + Text2.Text + "','" + Text3.Text + "','" + Text4.Text + "','" + Text5.Text + "','" + Text6.Text + "','" + Text7.Text + "')" 'zorg ervoor dat de inhouden van de textboxen in juiste kolommen wordt gezet
Call OpenDB ' Open een database-connectie
Set RECSET = CreateObject("ADODB.Recordset") ' zet de gegevens in de db
RECSET.Open RB, DBCON
DBCON.Close ' Sluit de dbconnectie af
End If
End If
End Sub

Private Sub Form_Load()
vul_listbox ' Roep de sub aan
End Sub

Sub vul_listbox() 'Listbox vullen met gegevens uit de database

List1.Clear
Call OpenDB
RB = "SELECT * FROM Test"
Set RECSET = DBCON.Execute(RB)
If Not RECSET.EOF Then
Do Until RECSET.EOF
List1.AddItem (RECSET("Naam")) ' Voeg alle gegevens uit de kolom Naam toe
RECSET.MoveNext
Loop
Else
List1.AddItem "Database is nog leeg"
End If
DBCON.Close

End Sub

Private Sub Command2_Click()
vul_listbox
End Sub

Private Sub List1_Click()
If List1.Text <> "" Then
Text1.Text = List1 ' vul textbox1 met de inhoud van de geselecteerde regel in de list
Call Command3_Click
End If
End Sub


Private Sub Command3_Click()

If Text1.Text <> vbNullString And Text1.Text <> "" Then
OpenDB
RB = "SELECT * FROM Test where Naam = '" & Text1.Text & "'"
Set RECSET = DBCON.Execute(RB)
Do Until RECSET.EOF
If RECSET("Naam") <> vbNullString Then Text1.Text = RECSET("Naam")
If RECSET("Geboortedatum") <> vbNullString Then Text2.Text = RECSET("Geboortedatum")
If RECSET("Telefoonnummerthuis") <> vbNullString Then Text3.Text = RECSET("Telefoonnummerthuis")
If RECSET("Telefoonnummerwerk") <> vbNullString Then Text4.Text = RECSET("Telefoonnummerwerk")
If RECSET("Mobieletelefoon") <> vbNullString Then Text5.Text = RECSET("Mobieletelefoon")
If RECSET("email") <> vbNullString Then Text6.Text = RECSET("email")
If RECSET("Opmerking") <> vbNullString Then Text7.Text = RECSET("Opmerking")
Label9.Caption = RECSET("Naam")
RECSET.MoveNext
Loop
DBCON.Close
End If

End Sub

Private Sub Command4_Click()
Dim strSQL
strSQL = "SELECT * FROM Test WHERE Id = '" & CDbl(Label9.Caption) & "'"

RECSET.Open strSQL, DBCON, , 3
RECSET.Fields("Naam") = Text1.Text
RECSET.Fields("Geboortedatum") = Text2.Text
RECSET.Fields("Telefoonnummerthuis") = Text3.Text
RECSET.Fields("Telefoonnummerwerk") = Text4.Text
RECSET.Fields("Mobieletelefoon") = Text5.Text
RECSET.Fields("email") = Text6.Text
RECSET.Fields("Opmerking") = Text7.Text
RECSET.Update
RECSET.Close

End Sub

Private Sub Command5_Click()
Dim strSQL

strSQL = "DELETE FROM test WHERE Naam = '" & Label9.Caption & "'"
RECSET.Open strSQL, DBCON, , 3
RECSET.Close

End Sub

Verwijderd

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
Private Sub Command4_Click()
  Dim strDBConn As String   'DataBase Connection String
  Dim strSQL    'SQL Statement
  Dim rs    'RecordSet

  'Maar DataBase Connectie string
  strDBConn = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=E:\Jeroen\School\4e jaar\PKA\test.mdb;"

  'Bouw een SQL Query
  strSQL = "SELECT * FROM Test WHERE Id = '" & CDbl(Label9.Caption) & "'"

  'Set rs als een Object van het type ADODB.RecordSet
  Set rs =  CreateObject("ADODB.RecordSet")

  'Open database met de mogelijkheid om te bewerken
  rs.Open strSQL, strDBConn, , 3
    'Vul de velden van de query
    rs.Fields("Naam") = Text1.Text
    rs.Fields("Geboortedatum") = Text2.Text
    rs.Fields("Telefoonnummerthuis") = Text3.Text
    rs.Fields("Telefoonnummerwerk") = Text4.Text
    rs.Fields("Mobieletelefoon") = Text5.Text
    rs.Fields("email") = Text6.Text
    rs.Fields("Opmerking") = Text7.Text
    'Voer de veranderingen uit
    rs.Update
  'Sluit het recordset
  rs.Close

  'Maar het rs geheugengebied weer leeg
  Set rs = Nothing

End Sub


Zo nu zou het moeten werken voor deze sub

Je code is verder wel toe aan een beetje structuur
maar kijk maar eerst of dit werkt

Verwijderd

Topicstarter
Nope helaas weer niet

foutmelding bij dezelfde regel : rs.Open strSQL, strDBConn, , 3

Runtime error

[Microsoft][ODBC Micorsoft Acces Driver] Too few parameters. Expected 1.

Verwijderd

vervang in de regel 3 is met adLockOptimistic

dat is uiteindelijk het zelfde maar mischien vind hij dat leuker bij jou

en btw welke compiler gebruik je om dit te compileren ?

  • whoami
  • Registratie: December 2000
  • Nu online
VBA wordt afaik niet gecompileerd, 't zijn trouwens run-time errors dat hij krijgt.

De melding Too few parameters krijg je ook als je een foutje in je SQL query hebt. (Verkeerde veldnaam, etc...)

https://fgheysels.github.io/


Verwijderd

Vervang
strDBConn = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=E:\Jeroen\School\4e jaar\PKA\test.mdb;"

is door

strDBConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=E:\Jeroen\School\4e jaar\PKA\test.mdb;"


is waarschijnlijk nettere maniet om je database te openen

btw Kijk ook is op
http://www.devguru.com/
en dan het hoofdstuk ADO
daar staat het hele ADO model uitgelecht dat is alles wat je nodig hebt voor het openen en werken met databases

Verwijderd

whoami

Als hij bezig is in VBA wat ik trouwens niet hieruit kan halen
dan is ie zo ie zo heel omslachtig bezig met Acces

dan kan je namelijk gebruik maken van Currentproject.Connection om zijn connectie string te krijgen

en zou ik zo ie zo geen VB code nodig hebben om te doen wat hij aan het doen is

dus ik neem aan dat hij VB gebruikt als Front-end en een MDB file als database back-end

Verwijderd

Messchien is het ook handig om uit je connectie string de spatie uit "4e jaar"
te verwijderen. Ik denk dat hij over ze zeik van gaat.

Verwijderd

Topicstarter
heb je toepassing aangemaakt holybrain

krijg nu alleen andere foutmelding maar nog wel op de steeds dezelfde regel

rs.Open strSQL, strDBConn, , 3

Foutmelding :
No Value given for one or more required parameters

Verwijderd

Topicstarter
al geprobeerd kurai, maakt niks uit, en ik kan wel gewoon dingen in de database zetten, en bekijken

Verwijderd

Wat kurai meld zou heel goed kunnen aangezien je
weet dit niet geheel zeker maar enkele of dubbele quote's om je dir moet zetten
dus verander je het is zo dat alles in de root van je E staat

trouwens als je het allemaal in Acces maakt dus dat de VB kode in het zelfde AccesS bestand zit als je database zelf

dan moet je het volgende is proberen


Verander rs.Open strSQL, strDBConn, , 3

in

rs.Open strSQL, Currentproject.Connection, , 3

  • mboy
  • Registratie: December 2001
  • Laatst online: 20-06-2024
Is het in plaats van rs.Open. niet rs.Execute :?

Oh ik kom er net achter dat je geen execute vanuit een recordset kan uitvoeren. Dat moet je uitvoeren vanuit de connectie. Dus: DBCONN.Execute ipv RECSET.Execute

[ Voor 64% gewijzigd door mboy op 03-12-2003 10:35 ]


  • whoami
  • Registratie: December 2000
  • Nu online
Mboy schreef op 03 december 2003 @ 08:43:
Is het in plaats van rs.Open. niet rs.Execute :?
Idd, ik heb al een aantal replies eerder zoiets gezegd (al heb ik de juiste methodnaam niet vermeld omdat ik die niet wist :P), maar iedereen heeft er blijkbaar over gelezen.

https://fgheysels.github.io/

Pagina: 1