Toon posts:

[VBA] Kan geen record toevoegen aan recordset!!

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

Verwijderd

Topicstarter
Ik kan geen record toevoegen aan een recordset. De recordset komt uit een dbf file en is alsvolgt opgezet:

Set Connection = New ADODB.Connection
Connection.ConnectionString = "Driver={Microsoft dBASE Driver (*.dbf)};" & _
"DriverID=277;" & _
"Dbq=file.dbf;"
Connection.ConnectionTimeout = 30
Connection.Open

Set Lijst = New ADODB.Recordset
Lijst.Source = "SELECT * FROM file.dbf"
Lijst.CursorType = adOpenKeyset
Lijst.LockType = adLockOptimistic
Lijst.Open , Connection


Ik kan de lijst prima uitlezen. Maar nu wil ik een record toevoegen aan de lijst:
lijst.addnew [Veld], [waarde]
lijst.update


Ik krijg bij update de melding : "kan de gegevens niet bijwerken, De database of het object is alleen lezen."

Ik weet niet wat ik fout doe, maar ik denk dat het te maken heeft met het feit dat ik met een dbf file bezig ben. Helaas kan dit niet anders...

  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

rechtsklikken dbf-file en readonly uitvinken?

Verwijderd

Topicstarter
Noop, die staat uit. Ik kan wel op de volgende manier een record toevoegen:

...
connection.open
connection.execute "insert into file.dbf ([veld]) values ([value])"
...
lijst.open


Dat gaat op zich ook prima, dus de file is wel te beschrijven maar ik snap niet dat het niet kan via de recordset.addnew

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:46

Creepy

Tactical Espionage Splatterer

Hmm.. ben geen VBA expert.. maar goed...

je source waar je wat aan toe wilt voegen is een Query... kan je daar niet de tabel van maken?
Iets toevoegen aan een selectie i.p.v. de gehele tabel dus.. en dat kan volgens mij niet..

Voor hetzelfde geld is het een query over 6 tabellen (m.b.v. joins/subselects etc). Moet ie dan alle 6 de tabellen gaan updaten als je iets toevoegt?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Idd. Over gelezen |:(

In een query kan je niet inserten.
Je source moet een tabel zijn.

  • cannibal
  • Registratie: Maart 2001
  • Laatst online: 20:14
Lijst.CursorType = adOpenKeyset
Lijst.LockType = adLockOptimistic

Deze moet je aanpassen.
In mijn strings voor ADO gebruik ik altijd iets als volgt:

rs.Open SQL, dbBoeking, adOpenDynamic, adLockPessimistic, adCMDText

Je moet dus even zoeken naar welke mogelijkheden je hebt voor CursorType (dynamic) en LockType (pessimistic) en wat hiervan de gevolgen van de gekozen typen is.

succes

Verwijderd

Topicstarter
[EDIT: IK REAGEER HIER OP HET BERICHT VAN CREEPY, ALVAST BEDANKT VOOR DE ANDERE TIPS!]

Misschien moet ik het inderdaad in die richting zoeken. Maar de tabel in kwestie (file.dbf is 1 tabel) is klein en erg simpel. De query neemt alle velden en sorteert ze alleen maar, dus dat zou moeten werken. Dat doet het in ieder geval in b.v. access. Maar misschien wordt dit hier resuluut niet toegelaten.

Ik heb de recordset ook al gekloond:
set lijst2 = lijst.clone
maar hier mag ik ook niets mee doen.

Ik ben het nu aan het omzeilen met
connection.execute "INSERT INTO..."

Dat gaat goed, maar ik MOET die record er later ook weer uithalen:

connection.execute "DELETE * FROM file.dbf where nummer=10"

Nu krijg ik de melding: "Kan geen gegevens verwijderen uit de opgegeven tabellen."

Snap hier ook weer niets van, zelfs als ik het delete commande METEEN uitvoer na connection.open

Verwijderd

Voor degenen die menen dat je aan een 'query' geen records toe kunt voegen en aan een 'tabel' wel:

Een query wordt uitgevoerd om je recordset te vullen...
Je recordset is eigenlijk niet meer dan je tabel in geheugen (geheel of gedeeltelijk)

De oplossing van het probleem van de topicstarter is wat lastiger. Wat je uit moet zoeken:
- ondersteunt dbase wel alle recordtypes? Kan best zijn dat jij een keyset opent, maar dat het stiekem een forward-only of een static is...
- welke locktypes ondersteunt dbase (optimistic/pessimistic)?

Suc6

edit:

Sorry, explicit language...

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:46

Creepy

Tactical Espionage Splatterer

De standaard dbase drivers staan dit soort dingen niet toe.. toevoegen aan tabellen ja..toevoegen aan een selectie nee. Maar nogmaals.. ik heb geen idee hoe VBA hier mee omgaat.

Een driver kan dit soort dingen voor je faken. Maar ik heb zelf dit soort dingen (al dan niet gefaked door de driver) alleen gezien bij ACCESS databases.. nog nooit bij DBase.

Dbase zelf, de standaard Delphi database componenten, en de C libraries die ik heb gebruikt ondersteunen dit dus allemaal niet... toevoegen aan een tabel wel.. niet aan een query.
code:
1
connection.execute "DELETE * FROM file.dbf where nummer=10"

dat werkt dus niet nee.. is geen correcte SQL query

Probeer deze eens:
code:
1
connection.execute "DELETE FROM file.dbf where nummer=10"

En waarom? Een delete query haalt 1 complete rij (tuple) weg. Geen losse velden

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:46

Creepy

Tactical Espionage Splatterer

Op donderdag 08 november 2001 09:14 schreef KingGeorge het volgende:
Voor degenen die menen dat je aan een 'query' geen records toe kunt voegen en aan een 'tabel' wel:

Een query wordt uitgevoerd om je recordset te vullen...
Je recordset is eigenlijk niet meer dan je tabel in geheugen (geheel of gedeeltelijk)
Ok... en nu dit in de praktijk NIET in access.. maar op een eehh. Dbase tabel :) Niet overtuigd? Goed... doe het dan eens niet in VBA.. maar in PLSQL op een Oracle systeem...
Nogmaals: Dat ACCESS al dan niet in combinatie met VBA dit ondersteunt wil niet zeggen dat andere drivers/talen/db's dit ook ondersteunen. Je hebt het trouwens ook helemaal niet nodig, het is er alleen maar om het makkelijker te maken voor de programmeur.. Voordat ik echt wat met ACCESS ging doen had ik van deze manier van werken nog NOOIT gehoord!

Als je zeker wilt zijn dat het altijd werkt op elke db:
- Gebruik ANSI SQL
- Toevoegen m.b.v. insert queries, desnoods met tabel componenten, maar nooit aan selectie (=query) componenten

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Bedankt Creepy voor de extra info.

Op zich heb ik het probleem gelukkig kunnen omzeilen, ik kan prima een record toevoegen aan de dbf file en hoef deze niet te verwijderen...

Maar natuurlijk kan ik het niet hebben dat het allemaal zo moeilijk werkt.
Ik moet helaas wel in VBA blijven werken en het programma is dusdanig eenvoudig dat ik niet met andere programma's wil werken. Daarom ben ik ook blij dat ik het heb kunnen omzeilen. Wat betreft die query met DELETE * FROM of DELETE FROM, het werkt allebei (of tenminste, het geeft dezelfde foutmelding, en in access, waat ik de sql stukjes probeer, mag het allebei..), ik weet ook niet waarom...

Op reactie aan KingGeorge:
Ik denk dat het probleem inderdaad daar ligt. Gelukkig is het nu niet meer aan de orde; dit programma moet snel af en ik heb geen tijd meer om het uit te zoeken. Toevallig dat ik nu met dbf files moet werken, ben niet echt van plan dit in de toekomst vanuit eigen keuze te gaan doen :)

THX, we zijn in ieder geval weer wat wijzer geworden op het gebied van connections do's and dont's *D
Pagina: 1