ADO und Access-DB(Abfrage)

09/07/2008 - 10:35 von Günter Giel | Report spam
Hallo NG,
ich habe ein kleines Problem mit Access-DB und ADO,
Und zwar, wenn ich mit dem Recordset eine Tabelle öffne, làuft alles super.
Wenn ich mit dem RS aber eine Abfrage öffne,tut sich nichts.

Kann mir jemand helfen?

Ich dachte immer, mit dem Adodb.Recordset kann mann auf Tabellen und
Abfragen zufgreifen?

Private CnA As ADODB.Connection

With CnA
.CursorLocation = adUseClient
.Mode = adModeShareDenyNone
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = strPathToDB
.Open
End With

Private Sub Command1_Click()

Dim RsA As ADODB.Recordset
Dim Table As String
Dim sSQL As String

If CnA.State = adStateClosed Then
MsgBox "keine Connection zur Datenbank", _
vbCritical
Exit Sub
End If

'Fehlerbehandlung
On Error GoTo Abbruch

Set RsA = New ADODB.Recordset

'Tabelle bestimmen
Table = "Artikel"--Hier ist der Hacken!!!!!Wenn
das eine Abfrage ist, passiert nichts!!!!

'Recordset laden
sSQL = "Select * From " & Table
With RsA
.CursorType = adOpenKeyset
.LockType = adLockReadOnly
.ActiveConnection = CnA
.Open sSQL
End With

'anzeigen in Flexgrid
FlexFillFromRs RsA, MSFlexGrid1
usw
end sub


Danke vielmals im voraus!!!
 

Lesen sie die antworten

#1 Peter Götz
09/07/2008 - 12:36 | Warnen spam
Hallo Günther,

ich habe ein kleines Problem mit Access-DB und ADO,
Und zwar, wenn ich mit dem Recordset eine Tabelle
öffne, làuft alles super.
Wenn ich mit dem RS aber eine Abfrage öffne,tut sich
nichts.

Kann mir jemand helfen?

Ich dachte immer, mit dem Adodb.Recordset kann mann auf Tabellen und
Abfragen zufgreifen?

Private CnA As ADODB.Connection

With CnA
.CursorLocation = adUseClient
.Mode = adModeShareDenyNone
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = strPathToDB
.Open
End With



Du solltest Dich entscheiden, ob Du mit einem
Connectionstring arbeitest oder eben nicht und
dafür die konkreten Werte an Eigenschaften
Deines Connectionobjektes übergibst. Dein
Code sollte besser so aussehen:

Dim FileName as string
FileName = "H:\Verzeichnis\DB.mdb"

Set Cnn = New ADODB.Connection
With Cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Properties("Data Source") = FileName
.CursorLocation = adUseClient

' DB im geteilten Modus öffnen, damit
' andere Benutzer ebenfalls mit dieser *.mdb
' arbeiten können.
.Mode = adModeShareDenyNone
.Open
End With



Private Sub Command1_Click()

Dim RsA As ADODB.Recordset
Dim Table As String
Dim sSQL As String

If CnA.State = adStateClosed Then
MsgBox "keine Connection zur Datenbank", _
vbCritical
Exit Sub
End If



Wenn Dein Connectionobjekt an dieser Stelle nicht geöffnet
ist, macht es wenig Sinn, den nachfolgenden Code noch
abzuarbeiten.

'Fehlerbehandlung
On Error GoTo Abbruch

Set RsA = New ADODB.Recordset

'Tabelle bestimmen
Table = "Artikel"--Hier ist der Hacken!!!!!Wenn
das eine Abfrage ist, passiert nichts!!!!

'Recordset laden
sSQL = "Select * From " & Table



Wenn in der Variablen Table der Name einer
in der *.mdb gespeicherten Abfrage steht, dann ist
das hölzernes Holz. Das wàre dann ein Select auf
das Ergebnis aus der Abfrage.

With RsA
.CursorType = adOpenKeyset



Beim Öffnen Deiner Connection hast Du
CursorLocation = adUseClient angegeben. ein
.CursorType = adOpenKeyset erfordert einen
serverseitigen Cursor.
Sinnvoll wàre hier z.B. ein

RsA.CursorLocation = adUseClient
RsA.CursorType = adOpenStatic


.LockType = adLockReadOnly
.ActiveConnection = CnA



Mit der vorstehenden Zeile erzeugst Du, vermutlich
unbewusst, eine neue Connection-Objektinstanz.
Richtig müsste es heissen

Set .ActiveConnection = CnA

Ohne das Set macht VB tatsàchlich soetwas:

.ActiveConnection.ConnectionString = CnA.Connectionstring

und öffnet mit den Angaben aus diesem Connectionstring
beim nachfolgen RS.Open eine neue Connectioninstanz,
die nicht die selbe ist wie jene, auf welche Deine
Objektvariable CnA verweist.


.Open sSQL
End With

'anzeigen in Flexgrid
FlexFillFromRs RsA, MSFlexGrid1
usw
end sub



Schau Dir mal das nachfolgende Beispiel an.
So etwa sollte Dein Code dann auch aussehen.

Private Sub AnySub()
Dim strMsg As String
Dim FileName As String
Dim AbfrageName as string
Dim Cnn As ADODB.Connection
Dim RS As ADODB.Recordset

FileName = "H:\Verzeichnis\DB.mdb"
AbfrageName = "Testabfrage"

On Error GoTo Fehler

Set Cnn = New ADODB.Connection
With Cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Properties("Data Source") = FileName
.CursorLocation = adUseClient

' DB im geteilten Modus öffnen, damit
' andere Benutzer ebenfalls mit dieser *.mdb
' arbeiten können.
.Mode = adModeShareDenyNone
.Open
End With

Set RS = New ADODB.Recordset
With RS
Set .ActiveConnection = Cnn
.Source = AbfrageName
.CursorType = adOpenStatic
.CursorLocation = adUseClient
.LockType = adLockReadOnly
.Open
End With

Stop

Ausgang:
Select Case True
Case RS Is Nothing
Case (RS.State And adStateOpen) = adStateOpen
RS.Close
End Select

Select Case True
Case Cnn Is Nothing
Case (Cnn.State And adStateOpen) = adStateOpen
Cnn.Close
End Select
Exit Sub

Fehler:
With Err
strMsg = "Fehler: " & CStr(.Number) & vbCrLf & _
"Source: " & .Source & vbCrLf & _
.Description
End With
MsgBox strMsg, vbExclamation
Resume Ausgang
End Sub

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen