[vb6] error: database read-only

Pagina: 1
Acties:

  • Freehumor
  • Registratie: April 2002
  • Laatst online: 25-05 20:02
Mensen,

Wij hebben voor onze studie een opdracht gekregen om een "winkeltje" te ontwerpen in Visual Basic 6 (SP 5) met Acces (2000) als database.

Nu zit ik echter met een probleem met bij de database.
We hebben in de database verschillende tabellen. Die tabellen lezen wij (project-maat en ik) in VB uit met een SQL:

code:
1
2
3
4
5
SELECT Artgroepen.*, Artikel.*, Artiest.*, Leveranciers.Levnr, Leveranciers.Levnm 
FROM Artgroepen, Artikel, Artiest, Leveranciers 
WHERE Artgroepen.Artgroepnr = Artikel.Artgroepnr 
AND Artiest.Artiestnr = Artikel.Artiestnr 
AND Artikel.Levnr =  Leveranciers.Levnr;


Als via VB iets in de database wilt toevoegen, krijg je de melding: Kan de gegevens niet bijwerken. De database of object is alleen lezen.

Natuurlijk is dit niet het geval. Ik heb namelijk alles nagekeken, zowel de database als in VB.

We maken gebruik van DAO, en ik heb begrepen (gezocht op GoT) dat je een ADO datacontrol moet gebruiken om het probleem te verhelpen.

Wij hebben nog niet veel verstand van VB, en moeten alles zelf uitzoeken. Nu hebben we de "search" van VB en van GoT gebruikt, maar wij snappen nog niet hoe we een ADO datacontrol kunnen maken.

Dit is onze DAO code om gegevens in de database toe te voegen:
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
Private Sub cmdToev_Click()
    ' declaraties
    Static blnVlag As Boolean
    
    ' status omzetten
    blnVlag = Not (blnVlag)
    
    ' bepaal toestand
    If blnVlag Then
    
    ' aangeven dat er een nieuw record gemaakt wordt
    datArtikelen.Recordset.AddNew
    
    ' knoptekst wijzigen
    cmdToev.Caption = "Toevoegen"
    
    ' focus op veld Artnr
    txtArtnr.SetFocus
    Else        ' gegevens aan database toevoegen
    
    ' nieuw record
    datArtikelen.Recordset("Artikel.Artnr") = txtArtnr.Text
    datArtikelen.Recordset("Artgroepen.Artgroepnr") = txtArtgroepnr.Text
    datArtikelen.Recordset("Artgroepen.Artgroepnm") = txtArtgroepnm.Text
    datArtikelen.Recordset("Artiest.Artiestnr") = txtArtiestnr.Text
    datArtikelen.Recordset("Artiest.Artienm") = txtArtienm.Text
    datArtikelen.Recordset("Artikel.Titel") = txtTitel.Text
    datArtikelen.Recordset("Artikel.Pps") = txtPps.Text
    datArtikelen.Recordset("Artikel.Artvoor") = txtArtvoor.Text
    datArtikelen.Recordset("Artikel.Artijz") = txtArtijz.Text
    datArtikelen.Recordset("Artikel.Artbest") = txtArtbest.Text
    datArtikelen.Recordset("Leveranciers.Levnr") = txtLevnr.Text
    datArtikelen.Recordset("Leveranciers.levnm") = txtLevnm.Text
    datArtikelen.Recordset.Update
        
    ' knoptekst wijzigen
    cmdToev.Caption = "Nieuw record"
    End If
    
End Sub


Wij willen dus gegevens kunnen toevoegen in verschillende tabellen van de database. Dit kan dus niet met DAO, wat is de makkelijkste manier om dit probleem op te lossen?

Graag duidelijk tips, want zoals ik heb gezegt, wij weten er weinig van af.
Alvast bedankt voor de moeite.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Sowieso 1 tip: Kijk eens naar Joins, want volgens mij gaat je SQL op een bepaald moment ook bokken.

[ Voor 97% gewijzigd door gorgi_19 op 06-12-2003 16:28 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

En als je connect via bv.: OleDbConnection class. Gaat het dan wel goed?
http://msdn.microsoft.com...bconnectionclasstopic.asp

[ Voor 23% gewijzigd door Verwijderd op 06-12-2003 19:22 ]


  • Freehumor
  • Registratie: April 2002
  • Laatst online: 25-05 20:02
Verwijderd schreef op 06 december 2003 @ 19:21:
En als je connect via bv.: OleDbConnection class. Gaat het dan wel goed?
http://msdn.microsoft.com...bconnectionclasstopic.asp
Ja misschien heb ik daar wel wat aan.

Ik ben nu een ADO object proberen te koppelen aan de database. Alleen dat lukt op de één of andere manier niet. Wat doe ik.
1) Een Ado Data Control 6.0 (sp4) (oledb) toevoegen aan "components"
2) Die in mijn formulier zetten.
3) Dan verbinding proberen te maken via de eigenschappen van ADO (custom)
4) Dan klik ik op "build"
5) Voorziening wordt: Microsoft OLE DB Driver for ODBC drivers
6) Ik klik op "verbindings reek gebruiken"
7) Computergegevensbron wordt: MS Acces-database (kleine D bij database)
8.) Selecteer de Database locatie (C:windowslolwsoft.mdb
9) Krijg bij verbindingsreek dit te zien:
code:
1
2
DSN=MS Access-database;DBQ=C:WINDOWSLOLwsoft.mdb;DefaultDir=C:WINDOWSLOL;DriverId=25;
FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;

10) Vink aan een leeg wachtwoord gebruiken
11) Bij Catalogus geef ik dit aan: C:WINDOWSLOLwsoft
12) Bij Geavanceerd geef ik aan 15 Seconden voor Time-Out en WriteRead rechten.
13) Dan druk ik op OKE
14) Bij Use Connection String komt te staan:
code:
1
2
3
4
provider=MSDASQL.1;Persist Security Info=False;Mode=ReadWrite;
Extended Properties="DSN=MS Access-database;DBQ=C:WINDOWSLOLwsoft.mdb;
DefaultDir=C:WINDOWSLOL;DriverId=25;
FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;";Initial Catalog=C:WINDOWSLOLwsoft

15) Bij Records Source geeft ik de SQL op (8 AdCmdUnknow):
code:
1
2
3
4
SELECT Artgroepen.*, Artikel.*, Artiest.*, Leveranciers.Levnr, Leveranciers.Levnm 
FROM Artgroepen, Artikel, Artiest, Leveranciers WHERE Artgroepen.Artgroepnr = Artikel.Artgroepnr 
AND Artiest.Artiestnr = Artikel.Artiestnr 
AND Artikel.Levnr =  Leveranciers.Levnr;

16) De rest laat ik zo staan.

Nu kan ik op de één of andere manier gebruik maken van deze ADO door de tekstboxen eraan te koppelen. Dat werkt. Hij gaat keurig vooruit. Nu kan ik ook gegevens toevoegen, zonder de melding alleen lezen. Maar er blijft echter een probleem ontstaan.

Hij geeft aan als ik de data wil toevoegen:
Run-time error l-2147217900 (80040e 14)':
[Microsoft][ODBC Microsoft Access-stuurprogramma] De opgegeven wijzigingen aan de tabel zi]n niet aangebracht omdat zi] dubbele waarden zouden opleveren voor de index, primaire sleutel of relatie Wi]zig de gegevens in het veld of de velden die dubbele gegevens bevatten of definieer de index opnieuw.
Afbeeldingslocatie: http://www.freehumor.nl/REST/Project/error.png

Dit zijn mijn relaties:
Afbeeldingslocatie: http://www.freehumor.nl/REST/Project/relaties.png

Dat klopt toch? Er is echter blijkbaar iets mis, wat ik over mijn hoofd zie.

Dit is mijn toevoeg code:
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
Private Sub cmdToev_Click()
    ' declaraties
    Static blnVlag As Boolean
    
    ' status omzetten
    blnVlag = Not (blnVlag)
    
    ' bepaal toestand
    If blnVlag Then
    
    ' aangeven dat er een nieuw record gemaakt wordt
    Adodc1.Recordset.AddNew
    
    ' knoptekst wijzigen
    cmdToev.Caption = "Toevoegen"
    
    ' focus op veld Artnr
    txtArtnr.SetFocus
    Else        ' gegevens aan database toevoegen
    
    ' nieuw record
    Adodc1.Recordset("Artnr") = txtArtnr.Text
    Adodc1.Recordset("Artgroepnr") = txtArtgroepnr.Text
    Adodc1.Recordset("Artgroepnm") = txtArtgroepnm.Text
    Adodc1.Recordset("Artiestnr") = txtArtiestnr.Text
    Adodc1.Recordset("Artienm") = txtArtienm.Text
    Adodc1.Recordset("Titel") = txtTitel.Text
    Adodc1.Recordset("Pps") = txtPps.Text
    Adodc1.Recordset("Artvoor") = txtArtvoor.Text
    Adodc1.Recordset("Artijz") = txtArtijz.Text
    Adodc1.Recordset("Artbest") = txtArtbest.Text
    Adodc1.Recordset("Levnr") = txtLevnr.Text
    Adodc1.Recordset("Levnm") = txtLevnm.Text
    Adodc1.Recordset.Update
        
    ' knoptekst wijzigen
    cmdToev.Caption = "Nieuw record"
    End If
    
End Sub

[ Voor 5% gewijzigd door Freehumor op 07-12-2003 14:58 . Reden: Sorry voor het verprutsen van de layout. ]


  • Uiligheid
  • Registratie: December 2000
  • Laatst online: 13-04 15:17

Uiligheid

alle gekheid op een stokje

Heb je toevallig in Access autonummering aanstaan voor artikelnummer? Dan hoef je dat veld namelijk niet te vullen met de ado-code, die kan je gewoon weglaten, hij nummert hem zelf. Op deze manier voorkom je ook dat gebruikers dubbele artikelnummers kunnen invoeren.

Ceterum censeo Carthaginem esse delendam


  • Freehumor
  • Registratie: April 2002
  • Laatst online: 25-05 20:02
Uiligheid schreef op 07 december 2003 @ 15:42:
Heb je toevallig in Access autonummering aanstaan voor artikelnummer? Dan hoef je dat veld namelijk niet te vullen met de ado-code, die kan je gewoon weglaten, hij nummert hem zelf. Op deze manier voorkom je ook dat gebruikers dubbele artikelnummers kunnen invoeren.
Dat maakt in dit geval weinig uit. Dit hebben we expres nog niet gedaan, omdat wij nu nog aan het testen zijn, vandaar.

  • Uiligheid
  • Registratie: December 2000
  • Laatst online: 13-04 15:17

Uiligheid

alle gekheid op een stokje

Freehumor schreef op 07 december 2003 @ 18:39:
[...]
Dat maakt in dit geval weinig uit. Dit hebben we expres nog niet gedaan, omdat wij nu nog aan het testen zijn, vandaar.
Nou ja, hij geeft aan dat de integriteit van de tabel op het spel staat, dus het lijkt mij evident om te kijken of dit een probleem kan zijn.

Wellicht test je ook met een waarde die al bestaat in de tabel, of bestaan heeft, met autonummering, je kan autonummering namelijk ook resetten in de tabel.

Ceterum censeo Carthaginem esse delendam

Pagina: 1