Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

MS Access - Zugriff auf Oracle-Blob über ODBC??





Frage

Hallo, wie kann ich aus MS Access heraus auf einen Blob, der in Oracle abgelegt ist, zugreifen? Die Oracle-Tabellen sind über ODBC in Access eingebunden und nun sollen die Blob-Inhalte (Bilder, PDF-Dateien) in Access (= VBA) zugreif- und erweiterbar gemacht werden. Wie geht das? Falls jemand schon einmal etwas ähnliches gemacht hat, würde ich mich sehr über Code freuen! Danke.

Antwort 1 von testfix4711

Hi,
die Anbindung der Tabellen in Access ist doch schon die halbe Miete!

Ein kleines Beispiel um auf eine Tabelle mit VBA zuzugreifen und sie auszulesen:

dim sql_text as string
dim tbl_oracle as new adodb.recordset

sql_text = "SELECT * FROM [TABELLE] " ORDER BY [SCHLÜSSELFELD]"
With tbl_oracle
.ActiveConnection = CurrentProject.Connection
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open sql_text, , , , adCmdText
If Not .BOF And Not .EOF Then
Do
....
.MoveNext
Loop Until .EOF
End If
.close
End With
set tbl_oracle = nothing

Viel Spass beim Testen!

TESTFIX4711

Antwort 2 von mike_kn

Hi,

vielen Dank. Habe inzwischen eine halbwegs funktionierende Lösung, auch dank http://support.microsoft.com/?id=103257, zumindest was das Auslesen betrifft.

Aber ich schaffe es irgendwie nicht, einen neuen Datensatz in Oracle anzulegen, es wird immer der (letzte) vorhandene überschrieben.

Das Problem dürfte das ID-Feld sein, das soll über einen Trigger automatisch hochgezählt werden (Ersatz für fehlendes auto_increment in Oracle), was auch klappt, aber wie komme ich an die nächste Zahl, wenn ich aus Access speichern möchte?

Im Moment arbeite ich mit movelast, aber das überschreibt, wie gesagt, die vorhandenen Daten. Sind noch gar keine Daten da, klappt die Lösung auch nicht...

Was kann ich probieren?

Antwort 3 von edi1985

Hi,

einen Weg möchte ich dir beschreiben.

Du legst eine Variable an und weist ihr den Insert-Befehl als Text zu. Danach führst du mit der Methode Execute deiner Connection mit der eben angelegten Variable als Parameter aus.

Angenommen, du möchtest folgenden Insert-Befehl ausführen lassen

INSERT INTO Leute (Name, Alter)
VALUES (´Bugs Bunny´, 7)


In VB(A) sieht es wie folgt aus:

strName = "Bugs Bunny"
intAlter = 7

strSQL = "INSERT INTO Leute (Name, Alter) " & _
"VALUES (´" & Replace(strName, "´","´´") & "´, " & intAlter & ") "

connection.Execute strSQL


Wobei ´connection´ in der letzten Zeile durch den Namen dein ´Connection-Variable´ ersetzt werden muss.

Ich hoffe, dass es verständlich war.

Antwort 4 von Ingolf

Hallo mike_kn:

Wenn Dein Problem am Auto-Increment liegen sollte, dann kann Dir die SEQUENCE von Oracle helfen. Die Sequence nutze ich sehr oft dann, wenn ich eine eindeutige ID brauche und die DB von mehreren Benutzern verwendet wird (da die Sequence von Oracle verwaltet wird, habe ich immer eine eindeutige ID).

- Sequence anlegen (noch mehr Parameter sind möglich, aber das nachfolgende Beispiel reicht):

Create Sequence mySequence
Start With 1
Increment by 1;

- Zugriff mit Erhöhung (das Select liefert die nächsthöhere Sequence):
select mySequence.nextval from dual;

- Zugriff ohne Erhöhung (das Select liefert die aktuelle Sequence):
select mySequence.currval from dual;

Vielleicht hilft Dir das weiter,
Gruß, Ingolf.

Antwort 5 von mike_kn

Danke euch beiden für die Antworten, hat mir weitergeholfen!

Sequence klappt (Trigger auch), Insert klappt.

Allerdings schaffe ich es nach wie vor nicht, an NextVal (oder CurrVal) zu kommen (also meine Id, die hochgezählt wird), da Access "dual" unbekannt ist und es so die Select-Anweisung nicht ausführt.

Wie kann ich auf diese ID aus VBA zugreifen?? Es muss doch einen Weg geben!

(Dafür eine neue Abfrage anzulegen klappt zwar prinzipiell, aber da speichert Access die nötigen ODBC-Zugangsdaten nicht und es ist ausgeschlossen, diese jedes Mal erneut einzutippen...).

Jeder Tipp (am besten mit Code, da ich nicht so geübt in Access bin :-) ) ist willkommen!

Antwort 6 von edi1985

Hi mal wieder,

ich arbeite an meinem Arbeitsplatz ausschließlich mit Oracle, allerdings natürlich mit den mitgelieferten Tools, deshalb kann ich dir nur einen Tipp geben, wie du es versuchen könntest. Versuch s mal mit

connection.Execute strSQL

wobei connection der Name der Connection ist und strSQL der Befehl.

Gruß

E.D.