Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1280to1284
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

ADO Copyfromrecordset - Problem

ADO Copyfromrecordset - Problem
10.10.2012 10:05:12
Chris
Hallo,
ich habe eine Excelabfrage, die ganz einfach Daten aus einer .mdb zieht. Ich hatte die Datei einige Zeit nicht verwendet und ich erinnere mich nicht, etwas geändert zu haben, aber jetzt zieht mir die ADO-Verbindung mit CopyRecordset keine Daten mehr. Die Accessabfrage lautet RVA5 - rufe ich diese in Access auf, zeigt sie mir auch die gewünschte Tabelle an. MS ADO 2.8 Library ist auch aktiviert. Das Excelmakro zeigt mir auch keinen Fehler an - an was könnte das denn liegen?
Hier der Code:

Sub writedata()
Application.ScreenUpdating = False
'Access-Quelldatei
Dim Datei As String
Datei = "S:\Rich_Cheap_archive_neu.mdb"
Rem 1. Verbindung zur Access DB herstellen
' Create a connection object.
Dim ADOCon As ADODB.Connection
Set ADOCon = New ADODB.Connection
With ADOCon
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = Datei
.CursorLocation = adUseClient
.Mode = adModeReadWrite
.Open
End With
Rem 2. Access Tabelle öffnen, Daten in Access zu schreiben
' Create a recordset object.
Dim ADORec As ADODB.Recordset
Set ADORec = New ADODB.Recordset
Set ADORec.ActiveConnection = ADOCon 'aktive Verbindung zuweisen
ADORec.Open "RVA5", ADOCon
Workbooks("Spread_Trade_Tool.xls").Sheets("Staaten_Raw").Range("A1").CopyFromRecordset   _
_ ADORec
Set ADORec.ActiveConnection = Nothing
' Tidy up
If ADORec.State = adStateOpen Then
ADORec.Close
End If
Set ADORec = Nothing
Set ADOCon = Nothing
End Sub

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ADO Copyfromrecordset - Problem
10.10.2012 13:59:38
Chris
Erstmal danke Luschi, aber ich glaube das war/ist nicht das Problem. Wenn ich meinen alten Code ausführe, dann erscheint im Ordner der .mdb eine .ldb - das müsste ja ein Zeichen sein, dass die Verbindung zur AccessDB hergestellt wurde, oder? Und auch wenn ich als ConnectionString
With ADOCon
' .Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=S:\RS\RSF\RSF_PUBLIC\Modelle\RichCheap\Rich_Cheap_archive_neu.mdb"
setze, passiert weiter nix.

Anzeige
AW: ADO Copyfromrecordset - Problem
10.10.2012 16:34:33
Luschi
Hallo Chris,
habe das mal getestet mit ADO, da ich das sonst immer noch per DAO mache.
Bei mir läuft das dann so:
ADORec.Open "Select * From RVA5;", ADOCon, CursorType:=adOpenForwardOnly, LockType:=adLockReadOnly
Gruß von Luschi
aus klein-Paris

AW: ADO Copyfromrecordset - Problem
10.10.2012 16:59:38
Chris
Hallo Luschi,
ich habe noch folgende Abfrage (mit Parametern allerdings), die einwandfrei läuft. Da stelle ich die Verbindung zur DB auch wie im Beispiel genannt dar. RVA5 ist übrigens eine Access-abfrage, genauso wie indiesem Beispiel SpreadRenditeZweierAnleihen (sind sehr lang, die möchte ich ungern als sql code in xl makro bauen).
SpreadRenditeZweierAnleihen:
Sub data_vergleich()
Application.ScreenUpdating = False
'Importsheets saeubern
Sheets("Vergleich").Range("A1").CurrentRegion.Clear
'Access-Quelldatei
Dim Datei As String
Datei = "S:\Rich_Cheap_archive_neu.mdb"
'Die beiden BB IDs der Anleihen definieren, werden spaeter als Parameter verwendet
Dim bloombergID1 As String
bloombergID1 = Sheets("Uebersicht").Range("G23").Value
Dim bloombergID2 As String
bloombergID2 = Sheets("Uebersicht").Range("H23").Value
'Objekte fuer die Datenbank definieren
Dim ADOCon As ADODB.Connection
Dim ADORec As ADODB.Recordset
Dim ADOCmd As ADODB.Command
Dim ADOPrm1 As ADODB.Parameter
Dim ADOPrm2 As ADODB.Parameter
'1. Verbindung zur Access DB herstellen
Set ADOCon = New ADODB.Connection
With ADOCon
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = Datei
.CursorLocation = adUseClient
.Mode = adModeReadWrite
.Open
End With
'2. Verbindung zuweisen, Recordset (=Speicher) zuweisen
Set ADOCmd = New ADODB.Command
Set ADORec = New ADODB.Recordset
ADOCmd.ActiveConnection = ADOCon
'3. Die Abfrage SpreadRenditeZweierAnleihen in Access vorbereiten, Parameter zuweisen
ADOCmd.CommandType = adCmdStoredProc
ADOCmd.CommandText = "SpreadRenditeZweierAnleihen"
Set ADOPrm1 = ADOCmd.CreateParameter(bloombergID1, adChar, adParamInput, 255, bloombergID1)
Set ADOPrm2 = ADOCmd.CreateParameter(bloombergID2, adChar, adParamInput, 255, bloombergID2)
ADOCmd.Parameters.Append ADOPrm1
ADOCmd.Parameters.Append ADOPrm2
Set ADOPrm1 = Nothing
Set ADOPrm2 = Nothing
ADOCmd.CommandTimeout = 300
Set ADORec = ADOCmd.Execute
Sheets("Vergleich").Range("A1").CopyFromRecordset ADORec
' Tidy up
If ADORec.State = adStateOpen Then
ADORec.Close
End If
Set ADORec = Nothing
Set ADOCon = Nothing
End Sub
Ich denke mal das Problem liegt entweder in der Abfrage RVA5 oder in Copyfromrecordset. Aber wie schon gesagt, RVA5 direkt in Access geöffnet, funktioniert und spuckt mir meine Tabelle aus. Kann ich irgendwie testen obs an copyfromrecordset liegt, gibts da ne alternative zum schreiben der Daten in xl? und kann es sein, dass man in den Eigenschaften oder sonst was on der RVA5-Abfrage was geändert hat, so dass diese nicht mehr von xl aus zugänglich ist?

Anzeige
AW: ADO Copyfromrecordset - Problem
10.10.2012 18:07:20
Luschi
Hallo Chris,
die Aufrufe der beiden Abfragen 'RVA5' & 'SpreadRenditeZweierAnleihen' sind 2 verschiedene Paar Stiefel.
Bei 'SpreadRenditeZweierAnleihen' machst Du das über das ADODB.Command-Objekt. Hier werden erst die Parameter übergeben und dann mit:
Set ADORec = ADOCmd.Execute
die Abfrage bzw. die gespeicherte Procedur ausgeführt und das Ergebnis dem RecordSet übergeben.
Entscheidend ist hier der Set-Befehl.
Die Ergebnisse der Abfrage 'RVA5' werden aber mit der ADODB.RecordSet.Open-Anweisung abgefragt - und die benötigt eben eine SQL-String.
Du hast nun die Möglichkeit, diesen 2. Aufruf auch auf das Command-Objekt umzustellen (was aber zuviel des Guten wäre und sehr viel 'OverHead' benötigt), oder bei der von mir aufgezeigten Variante zu bleiben.
Da der Excel-SQL-String ja nur sagt, schreibe alle Datensätze der Abfrage 'RVA5' in ein ADODB.RecordSet, aber nicht den SQL-String der Access-Abfrage selbst ändert, gibt es da überhaupt kein Problem.
Wenn die Backend-Access-DB auf einem File-Server liegt und es sich um sehr große Datenmengen handelt,
- frage ich über ein Excel-Formular die Randbedingungen ab
- bastele daraus einen SQL-String
- transferiere diesen SQl-String per ADOX in eine Dummy-Access-Abfrage
- und rufe diese dann auf mit der ADODB.RecordSet.Open-Anweisung ab.
Gruß von Luschi
aus klein-Paris
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige