# Mit VB auf Access-DB zugreifen ?



## ariesdave (20. Mai 2003)

Hallo,

kann mir jemand grob (vom Ablauf her) schildern, wie ich mit VB auf vorhandene Tabellen einer Access Datenbank zugreife?

Ich möchte ein kleines Programm schreiben, das die Benutzung dieser Tabellen ermöglicht (hineinschreiben und auslesen von Daten).

Ferner interessiert mich in diesem Zusammenhang die Verwendung der Steuerelemente 'DBList' und 'DBCombo', da diese ja speziell für die Arbeit mit Datenbanken zu sein scheinen.

Dankeschön.
-dave


----------



## Dario Linsky (20. Mai 2003)

Ich geh einfach mal davon aus, dass Du VB 6.0 benutzt, wenn nicht, dann sag mir  das bitte nochmal. 

Generell brauchst Du dafür ein Objekt für die Verbindung zur Datenbank. Dazu müsstest Du erst mal einen Verweis auf die "Microsoft ActiveX Data Objects 2.x" setzen, um auf die entsprechenden Objekte zugreifen zu können.
Weil das Verbinden mit der Datenbank in der Regel einige Zeit in Anspruch nimmt, ist es sinnvoll, das Verbindungsobjekt global für das ganze Projekt zu deklarieren. So kannst Du die Verbindung geöffnet lassen, bis die Anwendung wieder beendet wird. Also legst Du zunächst mal ein neues Modul in Deinem Projekt an, in dem Du folgenden Code schreibst:

```
Public conn As ADODB.Connection

Public Sub Main()
    'Verbindungsobjekt erzeugen und die Verbindung zur Datenbank aufbauen
    Set conn = New ADODB.Connection
    conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DateinameDerDatenbank
    'Restlicher Code (Formularaufrufe, etc...)
End Sub
```
In den Projektoptionen stellst Du das Startobjekt auf "Sub Main" ein. Dabei ist es aber relativ wichtig, dass Du in der Prozedur oben das Hauptformular aufrufst, weil das nicht automatisch passiert.

Mit Recordset-Objekten kannst Du dann über die hergestellte Verbindung zur Datenbank die Daten abfragen. Dazu brauchst Du wieder ein Objekt:

```
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

rs.Open "SELECT * FROM tabelle", conn, adOpenStatic, adLockPessimistic
If rs.RecordCount > 0 Then
    rs.MoveFirst
    Do While Not rs.EOF
        MsgBox CStr(rs.Fields("feld").Value)
        rs.MoveNext
    Loop
Else
    MsgBox "Keine Daten gefunden!", vbExclamation, "Achtung"
End If
rs.Close
```
Logischerweise musst Du die Tabellen- und Feldnamen ändern, das ist nur ein Beispiel. Mit dem Recordset-Objekt hast Du also eine Art Abbild von dem Ergebnis der Abfrage.
In dem Beispiel geht es aber erst mal nur um das Lesen von Datenbankinhalten. 
Wenn Du in die Tabelle schreiben willst, kannst Du die Werte wie an eine normale Variable übergeben:

```
rs.Fields("feldname").Value = Wert
```
Wichtig beim Schreiben ist aber, dass Du hinterher mit der Update-Methode die Änderungen speicherst. Ansonsten wären noch die Methoden "AddNew" (zum Anlegen neuer Datensätze) und "Delete" (zum Löschen von Datensätzen) wichtig. Und natürlich die Move****-Befehle, mit denen Du einen anderen Datensatz auswählen kannst.

Ich hoffe, das hat Dir geholfen.


----------



## ariesdave (20. Mai 2003)

Hallo Lirion,

danke, das hat mir erstmal geholfen. Bei Problemen melde ich mich wieder .

Schöne Grüße
-dave


----------



## Cthulhu (24. Juli 2003)

*In Access DB schreiben*

Hallo zusammen

im moment befasse ich mich auch mit dem Zugriff auf eine AccessDB von VB aus. Ich konnte aber nicht herausfinden, wie ich daten in eine Tabelle schreiben kann.

Wäre froh, wenn mir jemand ein codebeispiel geben könnte. 

Danke und gruss 

Beni


----------



## Dario Linsky (24. Juli 2003)

> Wenn Du in die Tabelle schreiben willst, kannst Du die Werte wie an eine normale Variable übergeben:
> 
> ```
> rs.Fields("feldname").Value = Wert
> ...


----------



## Cthulhu (25. Juli 2003)

Guten Morgen

Danke für die Hilfe. Ich habs jetzt rausgefunden. Ich wusste nicht wie den rs zu öffnen und zu updaten. Aber bei jedem rs.fields eintrag wird auf eine neue zeile in der db geschrieben, wie kann ich das verhindern?


Vielen Dank

Beni


----------



## Dario Linsky (25. Juli 2003)

> Ich wusste nicht wie den rs zu öffnen und zu updaten


Steht ebenfalls da...



> Aber bei jedem rs.fields eintrag wird auf eine neue zeile in der db geschrieben, wie kann ich das verhindern?


?
Fields = Felder = Spalten.
Records = Zeilen.


----------



## Cthulhu (25. Juli 2003)

Hallo Lirion 

Danke dir viel mals, dass du mir hilfst. Leider verstand ich deine letzt Hilfe nicht. Ich immer noch Mühe, einen Datensatz in eine Tabelle einzufügen. Ich versuche es im Moment mit einem SQL- String, bekomme aber fehler, denke es liegt daran, dass die erste spalte eine automatische id ist. Ich will aus einem Excel File die Daten herauslesen und genauso in eine DB übertragen.

Wär cool wenn du mir helfen könntest. (habe den code noch angefügt)


```
'Verbindungsobjekt erzeugen und die Verbindung zur Datenbank aufbauen
        '--------------------------------------------------------------------
        statusbar.Caption = "Verbindung zur DB wird erstellt..."
        Set AdoCmd = New ADODB.Command
        Set conn = New ADODB.Connection
        Set rs = New ADODB.Recordset
        
        With conn
            '.Provider = "Microsoft.Jet.OLEDB.4.0;Data Source=Pfad\name.mdb"
            ConStr = "Pfad\name.mdb"
            .Provider = "Microsoft.Jet.OLEDB.3.51"
            
            .Open (ConStr)
            
            If .State = adStateOpen Then
                statusbar.Caption = "Verbindung offen!"
            Else
                MsgBox "Fehler beim öffnen..."
                Exit Sub
            End If
        End With
        
        reader = WBook1.Sheets(1).Cells(2, 1).Value
                
        rs.Open "INSERT INTO table1(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q," _ 
"r,s,t,u,v,w,x,y,z,aa) VALUES(einfuegen(0), einfuegen(1), einfuegen(2), " _
"einfuegen(3), einfuegen(4), einfuegen(5), einfuegen(6), einfuegen(7), einfuegen(8), einfuegen(9), " _
"einfuegen(10), einfuegen(11), einfuegen(12), einfuegen(13), einfuegen(14), einfuegen(15), " _
einfuegen(16), einfuegen(17), einfuegen(17), einfuegen(18), einfuegen(19), einfuegen(20), " _
einfuegen(21), einfuegen(22), einfuegen(23), einfuegen(24), einfuegen(25), einfuegen(26)", _
conn, adOpenKeyset, adLockOptimistic
       
       
      
        For spaltenzahler = 1 To 28
    
           Do While Not reader = ""
           
                
                rs.AddNew
           
                If Not spaltenzahler = 23 Then
            
                    reader = WBook1.Sheets(1).Cells(colonnenzahler, spaltenzahler).Value
                    If reader = "" Then
                        reader = 0
                    End If
                    
                    Debug.Print rs.Fields(1).Type
                    rs.Fields.Item(counter).Value = reader
    
                    colonnenzahler = colonnenzahler + 1
                    
                    reader = WBook1.Sheets(1).Cells(colonnenzahler, spaltenzahler).Value
                    
                End If
    
            Loop

            rs.Update
             
            spaltenzahler = spaltenzahler + 1
            colonnenzahler = 2
            blankworkbookzahler = blankworkbookzahler + 1
            counter = counter + 1
            
            reader = WBook1.Sheets(1).Cells(colonnenzahler, spaltenzahler).Value
        
        Next
        
        rs.Close
        excelClose
```


----------



## Dario Linsky (25. Juli 2003)

Was spricht gegen ein insert-Query? Ist doch völlig korrekt.
Auch wenn das Recordset-Objekt aus der ADO-Bibliothek eine AddNew-Methode zur Verfügung stellt.

In diesem Sinne: RTFM. 

PS: Bitte Code-Tags benutzen.


----------



## sunygirl (11. November 2004)

Dario Linsky hat gesagt.:
			
		

> In den Projektoptionen stellst Du das Startobjekt auf "Sub Main" ein. Dabei ist es aber relativ wichtig, dass Du in der Prozedur oben das Hauptformular aufrufst, weil das nicht automatisch passiert.
> .



Hi bräuchte auch mal deine Hilfe, wo stell ich denn die Projekoptionen ein?


----------



## Chandini (11. November 2004)

Du hast rechts oben dein Projekt stehen mit sämtlichen Formularen, die drin sind.
Wenn du nen Rechtsklick auf den Namen deines Projekts machst, dann findest in dem Menü den Punkt "Eigenschaften" (evtl. heißt er auch "Projekteigenschaften").
Die öffnest du und da hast dann die Möglichkeit, das Startobjekt festzulegen. Da kannst dann den Projekt zum Beispiel auch ne Versionsnummer geben, Copyright mit einfügen und so...

vlg, Ines


----------



## Rene42 (28. Januar 2007)

Hi

Ich hab VB 2005. 

Nun frage ich mich wie ich hiermit auf eine von Access geschaffene Datenbank zugreifen kann.


----------

