[VBA] Database koppeling.

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

Acties:
  • 0 Henk 'm!

Anoniem: 60620

Topicstarter
Ik wil vanuit VBA (Excel) een koppeling maken met een database (MS SQL Server Express)
Ik heb inmiddels in het Control Panel al een ODBC koppeling gemaakt met de DB.

Ik weet alleen niet hoe ik die vanuit VBA kan benaderen. De help helpt mij ook niet aangezien ik daar alleen maar op statements kan zoeken. Ik weet alleen niet welke ik nodig heb dus ook niet waar ik op moet zoeken.

Ook met google krijg ik geen resultaten waar ik iets mee kan. (nou is zoeken met google ook niet 1 van mijn talenten)

Nou ik mijn vraag dus: Welke statements heb ik nodig om verbinding te maken met de database en daarvervolgens query's op uit te voeren?

Al vast bedankt.

Acties:
  • 0 Henk 'm!

  • glmona
  • Registratie: Maart 2005
  • Laatst online: 02-07 08:15
Waarom niet gewoon in VB6 of VB.NET een verbinding maken de DB en eventueel Excel-API aanspreken via Reference (dll)?

Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 14:39

mulder

ik spuug op het trottoir

glmona schreef op donderdag 12 april 2007 @ 09:49:
Waarom niet gewoon in VB6 of VB.NET een verbinding maken de DB en eventueel Excel-API aanspreken via Reference (dll)?
Misschien omdat hij VBA gebruikt?

Hier een tutorial, goede referentie site ook: http://www.devguru.com/fe...ADOandASP/adoTutorial.asp

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

Anoniem: 60620

Topicstarter
Helemaal snappen doe ik de keuze ook niet.
Heeft te maken met dat het gene wat er gemaakt moet worden nou al in Excel staat en daar wel voordelen aan zitten.
En licentie kosten spelen ook nog een belangrijke rol, het is voor intern gebruik en kan dus niet rechtstreeks doorberekent worden.

Ik denk dat ik met die tutorial wel wat kan. Ga het gelijk proberen.
Bedankt.

Acties:
  • 0 Henk 'm!

Anoniem: 60620

Topicstarter
Die tutorial heeft me wel wat verder geholpen.
Alleen is ASP niet helemaal hetzelfde als VBA. Vooral het recordset gedeelte werkt anders.
Wat heb ik allemaal nodig om in VBA een query uit te voeren. Ik kom ergens in de help ook een command tegen. Is dat ook nodig of alleen voor extra functies?
En een PivotTable?

Acties:
  • 0 Henk 'm!

Anoniem: 60620

Topicstarter
Het gaat fout bij het uitvoeren van de query.
Dus bij
rs.Open "SELECT * FROM table"
waar rs een recordset is.

Acties:
  • 0 Henk 'm!

Anoniem: 113297

volgens de site van devguru
Visual Basic:
1
2
3
4
Set adocn = CreateObject("ADODB.Connection")
  adocn.Open "benoemdeodbcverbinding"
  Set rs = adocn.Execute("select * from table")
  MsgBox rs.Fields(1)

maar vergeet odbc, gebruik liever oledb. ik veronderstel dat de ms sql server express dezelfde connectiestring heeft als de fullblown sql server.

Acties:
  • 0 Henk 'm!

  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 05-07 16:36
Ik doe altijd een onderstaande om een recordset aan te maken:

Visual Basic:
1
2
3
4
5
6
7
dim db as database
dim rst as dao.recordset
dim strSQL as string

db = 'connectie naar je database
strSQL = "SELECT * FROM tabel"
rst = db.openrecordset(strSQL)

(\__/) Ik wist totaal niet wat hier neer te zetten....
(='.'=) Dus het werd....
("")("") Een konijn!!


Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 14:39

mulder

ik spuug op het trottoir

Anoniem: 60620 schreef op donderdag 12 april 2007 @ 12:09:
Die tutorial heeft me wel wat verder geholpen.
Alleen is ASP niet helemaal hetzelfde als VBA. Vooral het recordset gedeelte werkt anders.
Wat heb ik allemaal nodig om in VBA een query uit te voeren. Ik kom ergens in de help ook een command tegen. Is dat ook nodig of alleen voor extra functies?
En een PivotTable?
ASP gebruikt VBScript, wat een inprincipe VBA is. Verder is het niet mij duidelijk wat er niet werkt? Krijg je errors?

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

Anoniem: 60620

Topicstarter
Ik heb al veel dingen geprobeerd maar hij blijft fout gaan op het vullen van de Recordset met de uitkomst van een query.
Automation error

Acties:
  • 0 Henk 'm!

Anoniem: 113297

als we geen code zien zullen we niet ver geraken. gebruikersnamen en wachtwoorden kun je weglaten.

toch even enkele bemerkingen
- odbc goed geconfigureerd?
- dao/ado niet door mekaar aan het halen?
- database staat nergens anders open/is handmatig geopend?

Acties:
  • 0 Henk 'm!

Anoniem: 60620

Topicstarter
Ik had net ineens een ingeving wat ik nog kon proberen.
In die tutorial die hier gepost is maken ze een ODBC koppeling aan in het tabblad System DSN
Nou heb ik ook een koppeling in het tabblad User DSN
En als ik die gebruik werkt het wel.
Bedankt voor julie reacties.

Acties:
  • 0 Henk 'm!

Anoniem: 60620

Topicstarter
De (test) code die ik nou heb, en dus werkt.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub test()
    Dim db As Object  'connectie
    Dim rs As Object  'recordset
    Dim strQuery As String
    

    Set db = CreateObject("ADODB.Connection")
    db.Open "A"
     
    strQuery = "Select * FROM ram_RawMat"
    
    Set rs = CreateObject("ADODB.Recordset")
    Set rs = db.Execute(strQuery)
    

    Do While Not rs.EOF
       MsgBox (rs("ram_Name"))
       rs.MoveNext
    Loop
     
    db.Close
    Set db = Nothing

End Sub

Acties:
  • 0 Henk 'm!

Anoniem: 60620

Topicstarter
Het werkt nou inderdaad goed, met een select query.
Als ik echter een andere query wil uitvoeren krijg ik een automation error.
Dus bij een delete of insert query.
Wat is het verschil tussen deze query's? waarom select het wel doet en insert niet?

Acties:
  • 0 Henk 'm!

  • YellowCube
  • Registratie: December 2001
  • Laatst online: 13:11

YellowCube

Wait...what?

waarschijnlijk omdat een Select statement daadwerkelijk iets terug geeft (een recordset).
Een Insert en Delete statement doen dat niet. Ik denk dat je het daar moet zoeken en dan met name in
code:
1
 Set rs = db.Execute(strQuery)


je kunt i.p daarvan deze proberen:
code:
1
rs.Open SQLstatement, connectionstring, adOpenStatic, adLockOptimistic

[ Voor 25% gewijzigd door YellowCube op 17-04-2007 09:29 ]

My doctor says that I have a malformed public-duty gland and a natural deficiency in moral fibre and that I am therefore excused from saving the world


Acties:
  • 0 Henk 'm!

Anoniem: 60620

Topicstarter
Dat zou dan dus
code:
1
rs.Open strQuery, bd ,? ,?

worden.
Alleen wat moet ik op de vraagtekens zetten?

Trouwens porbeer ik een insert ook te doen zonder het Set rc =. Dus alleen
code:
1
db.Execute(strQuery)

Acties:
  • 0 Henk 'm!

  • YellowCube
  • Registratie: December 2001
  • Laatst online: 13:11

YellowCube

Wait...what?

het zit 'm juist in de Execute optie. Die verwacht als het ware dat er iets terug komt.
Bij dei vraagtekens kun je gewoon dezelfde waardes invullen als in mijn voorbeeld. Het zegt iets over de manier waarop je de database benadert en het wordt pas belangrijk op het moment dat je met heel veel gebruikers tegelijk bewerkingen of zoektochten gaat doen door hele grote hoeveelheden data.
is kort door de bocht genomen de manier hoe je daar tegenaan moet kijken

My doctor says that I have a malformed public-duty gland and a natural deficiency in moral fibre and that I am therefore excused from saving the world


Acties:
  • 0 Henk 'm!

  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 05-07 16:36
Je wilt juist een recordset om van alles mee uit te voeren neem ik aan. Op het moment dat je je select query hebt uitgevoerd zit dit in je recordset en kun je hiermee van alles op die data uitvoeren. Een recordset bevat dus een aantal records en het is dus logisch dat je geen delete query uit kunt voeren, want dit geeft geen records als resultaat in de recordset. Met een select query krijg je wel records terug waarmee je dan wel weer wat kunt uitvoeren, denk hierbij aan de volgende statements:

Visual Basic:
1
2
3
rs.addnew
rs.delete
rs.update

(\__/) Ik wist totaal niet wat hier neer te zetten....
(='.'=) Dus het werd....
("")("") Een konijn!!


Acties:
  • 0 Henk 'm!

Anoniem: 60620

Topicstarter
Ik heb eigenlijk alleen nog maar ervaring met programmeertalen waar alle query's op de zelfde manier werken.
helemaal snappen doe ik het ook niet met dat terug verwachten.
code:
1
2
Set rs = db.Execute("SELECT....")
db.Execute("INSERT INTO....")

Waarom zou de tweede iets terug verwachten? Zo staat het ook in de tutorial die in de 2 reply gepost is. En het komt ook gewoon logisch over naar mij...

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Om te beginnen zou je helderder moeten maken of je met DAO of met ado werkt.
code als
code:
1
2
Set rs = db.Execute("SELECT....")
db.Execute("INSERT INTO....")

Ziet er, vooral door het gebruik van de variabele db uit als good ol' DAO, maar je werkt verder met ADO objecten. Weet je zeker dat je verchillende manieren aan het mixen bent?

Verder zou je de opmerking van _heretic_ ter harte moeten nemen: vergeet ODBC en gebruik de oledb provider.

Daarnaast heeft vba nog een syntax grapje mbt het tussen haakjes zetten van functieargumenten.
code:
1
2
3
        var=functie(x)                 'het resultaat van de functie wordt in var gezet
        functie x                        'functie wordt aangeroepen, resultaat wordt weggegooid
        functie(x)                       'geeft syntax error

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 04-07 15:03

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 05-07 16:36
Anoniem: 60620 schreef op woensdag 18 april 2007 @ 08:14:
Ik heb eigenlijk alleen nog maar ervaring met programmeertalen waar alle query's op de zelfde manier werken.
helemaal snappen doe ik het ook niet met dat terug verwachten.
code:
1
2
Set rs = db.Execute("SELECT....")
db.Execute("INSERT INTO....")

Waarom zou de tweede iets terug verwachten? Zo staat het ook in de tutorial die in de 2 reply gepost is. En het komt ook gewoon logisch over naar mij...
Ik heb eigenlijk alleen ervaring met vba en ben geen programmeur. Wat ik eigenlijk bedoel is het volgende: met vba kun je gebruik maken van recordsets. In Access (waar ik veel mee werk) kun je op verschillende manieren je data wijzigen via vba. Ik gebruik hiervoor recordsets. In een recordset zet je een aantal records (via een SELECT statement) welke je vervolgens kunt gebruiken om diverse taken mee uit te voeren (tonen, bewerken, verwijderen, toevoegen, etc.). Dit doe je bijvoorbeeld met de statements die ik in mijn vorige post genoemd heb.

In het bovenstaande voorbeeld zet je eerst een aantal records in een recordset en daarna wil je los van de query een SQL query op de database los laten. Waarom zet je die records dan eerst in een recordset? Dit lijkt me in dat geval dan niet helemaal nodig. Indien je met recordsets wil werken, lijkt het me logisch dat je ook op die manier je records gaat bewerken.

Indien je geen recordsets wil gebruiken en dus direct de query's op je db wilt loslaten kan ik me voorstellen dat je een ander statement moet gebruiken. In Access kan ik hier bijvoorbeeld de docmd.runsql() voor gebruiken. Omdat je connect naar een andere db kan je dit volgens mij niet doen. Misschien is er iets als db.runsql?

(\__/) Ik wist totaal niet wat hier neer te zetten....
(='.'=) Dus het werd....
("")("") Een konijn!!


Acties:
  • 0 Henk 'm!

Anoniem: 60620

Topicstarter
Het is echt allemaal veel ingewikkelder dan ik in het begin dacht. Ik had echt verwacht in een dag wel alles met de database koppeling werkend te hebben. Dacht dat daar wel een stukje standaard code voor was.

Wat het verschil tussen ADO en DOA weet ik niet percies. Ook het verschil tussen ODBC en OLEDB zegt me niet veel.

Ik krijg alleen steeds minder zin in het hele gebeuren. Ook al omdat VBA absoluut niet mijn keuze was.

Voor een select query wil ik een record set zodat ik wel met de gegevens kan doen. Dat stuk heb ik ook werkend. Alleen het simpel uitvoeren van een insert of delete query wil dus niet lukken.

De functie aanroepen zonder haakjes en runsql werken ook niet.

[ Voor 4% gewijzigd door Anoniem: 60620 op 18-04-2007 10:37 ]

Pagina: 1