Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

ORACLE Tabelle in Access importieren/verlinken

Begonnen von flipse, Mai 08, 2015, 10:20:55

⏪ vorheriges - nächstes ⏩

flipse

Hallo zusammen,

ich versuche gerade verzweifelt eine Tabelle aus einer Oracle-DB in Access zu integrieren.
Dabei ist es für mich irrelevant ob ich die Daten kopiere, oder nur als verknüpfte Tabelle einfüge.

Eine ODBC Quelle kann ich aus Berechtigungsgründen nicht einrichten.
Es muss also über VBA laufen. Leider laufe ich dabei immer wieder auf den Fehler 3170 (Installierbares ISAM nicht verfügbar... oder so).

Könnt ihr mir weiterhelfen?

Mein aktueller Code sieht wie folgt aus (ADO)


Dim dbConRead As New ADODB.Connection
  Dim dbConWrite As New ADODB.Connection
  Dim rsRead As New ADODB.Recordset
  Dim rsWrite As New ADODB.Recordset
  Dim strConn As String
 
  Dim strSourceTable As String, strTargetTable As String
 
  strTargetTable = "test"
  strSourceTable = "QUELLTABELLE"

  Set rsWrite = New ADODB.Recordset
  Set rsRead = New ADODB.Recordset

  strConn = "Driver={Microsoft ODBC for Oracle};"
  strConn = strConn & "Server=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=XXXXX)(PORT=1550))(CONNECT_DATA=(SID=XXXXX)));"
  strConn = strConn & "Uid=XXXXX;Pwd=XXXXX;"
 
  dbConRead.ConnectionString = strConn
  dbConRead.Open

If dbConRead.State = adStateOpen Then
       MsgBox "Connection successful."
End If



Die Verbindung wird erfolgreich aufgebaut. Aber dann komme ich einfach nicht mehr weiter. Danke für Eure Hilfe.

Wurliwurm

Der gepostete Code enthält eine ODBC-Quelle. Versuch mal OLEDB mit meinem Code unten, mußt natürlich IP-Adresse und SYSID anpassen. Voraussetzung ist, daß der Oracle-Client auf dem PC installiert ist.

Public conn as ADODB.Connection

Private Function OracleVerbindungAufbauen(ByVal strUsername, ByVal strPassword) As Boolean
On Error GoTo Fehlermeldung
   
    Const strServerIP As String = "192.168.0.40"
    Const strServerPort As String = "1521"
    Const strOracleSystemKey As String = "XE"
    Const strDBSystem As String = "OraOLEDB.Oracle.1"

    Dim strConnectionString As String
    strConnectionString = "Provider=" & strDBSystem & ";" & _
                          "Data Source=" & strServerIP & ":" & strServerPort & strOracleSystemKey & ";" & _
                          "User ID=" & strUsername & ";" & _
                          "Password=" & strPassword
    'Debug.Print strConnectionString
   
    Set conn = New ADODB.Connection
    With conn
        '.IsolationLevel = adXactReadCommitted
        '.IsolationLevel = adXactIsolated
        .IsolationLevel = adXactSerializable
        '.Mode = adModeShareExclusive
        .Mode = adModeShareDenyWrite
        '.Mode = adModeShareDenyRead
        .CursorLocation = adUseServer
    End With
   
    conn.Open strConnectionString
    OracleVerbindungAufbauen = True

Exit Function
Fehlermeldung:
OracleVerbindungAufbauen = False
MsgBox "Error# " & conn.Errors(0).NativeError & ": " & conn.Errors(0).Description & "    ", vbCritical, "Datenverbindung aufbauen    "
End Function

flipse

Dankeschön,
dann fehlt mir aber noch, wie ich die Daten kopieren kann.

Über die OpenSchema Methode kann ich mir derzeit zumindest schon mal die Spaltenbezeichnungen ausgeben lassen. Aber ich möchte ja die Daten komplett importieren.

Vielen Dank

Wurliwurm

Zitat von: flipse am Mai 08, 2015, 12:19:07
Dankeschön

Gibt meine Funktion OracleVerbindungAufbauen den Wert TRUE zurück? Solange das nicht funktioniert, macht es keinen Sinn, an den Import zu denken.

Ich würde Die nahelegen, zu beschreiben, was genau Du vorhast. Ich nehme an, Du willst einen Dump ziehen. Da gibt es viele Wege.

flipse

Ja, die Verbindung klappt.
Ich will eine 1:1 Kopie der Tabelle ziehen.
Ich habe weder die Struktur, noch irgendwelche Daten in Access. Es soll eine Art "Tabellenerstellungsabfrage" durchgeführt werden und die neue Tabelle mit Daten gefüllt werden.

Wurliwurm

Zitat von: flipse am Mai 08, 2015, 12:34:55
Ja, die Verbindung klappt.

Wirklich?
Mir ist beim Posten des Codes noch ein Fehler unterlaufen. Es fehlt der Slash zwischen Port und SID. Korrekt wäre der ConnectionString
"Provider=OraOLEDB.Oracle.1;Data Source=192.168.178.40:1521/xe;User ID=abc;Password=123"

Läuft die Datenbank auf dem PC oder im Netz? Poste mal Deinen ConnectionString anoymisiert.

Wenn Du wirklich mit der Datenbank verbunden bist, probiere folgende SQL-Statements in ein Recordset zu bekommen:
SELECT TABLE_NAME FROM USER_TABLES; (gibt alle Tabellen des aktuellen Schemas aus)
SELECT * FROM USER_TAB_COLS WHERE TABLE_NAME = 'MEINETABELLE' ORDER BY COLUMN_ID;   
(gibt alle Spalten der Tabelle aus)

Dann könntest Du daraus eine CREATE-TABLE anweisen zusammenbauen, diese entweder in ADO oder besser in DAO, weil die Tabell ja im lokalen Access angelegt werden kann.

Ich würde Dir empfehlen, hier eine Struktur aus Subs und Funktionen auszudenken, damit Du in Zukunft jede Tabelle/View nur mit Eingabe des Tabellennamens anlegen und befüllen kannst. Also nicht spaghettimäßig den Verbindungsaufbau, das Erstellen der lokalen Tabelle und das Füllen derselben in ein Sub runterschreiben und dabei Literale wild im Quelltext zu verteilen.

flipse

Du hast recht, ich hab vergessen auf die neue funktion zuzugreifen.
Die Verbindung mit deinem Skript funktioniert noch nicht.
Wo genau hinterlege ich die SID?

Ich habe jetzt folgenden ConnectionString gewählt:
strConnectionString = "Provider=OraOLEDB.Oracle;Data Source=(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=" & strServerIP & ")(PORT=" & strServerPort & ")))(CONNECT_DATA=(SID=" & strServerSID & ")(SERVER=DEDICATED)));User Id=" & strUserName & ";Password=" & strPassword & ";"

Da erhalte ich auch eine Verbindung.

Wie mache ich nun weiter?


Wurliwurm

#7
Die SID muß in der Datei TNSNAMES.ORA stehen
http://docs.oracle.com/cd/E11882_01/install.112/e47959/post_install.htm#NTCLI1309

Aber wenn eh schon Du drin bist, dann geht es darum, eine Tabellendefinition auszulesen. OpenSchema von MS kenne/kann ich nicht, ich würde an Deiner Stelle direkt auf das ORACLE-Data-Dictionary zugreifen. Das geht mit reinem SQL:

Dim rs as adodb.recordset
Dim SQL as string
Dim i as integer
Dim strtabelle as string

strtabelle = "MEINETABELLE"

SQL = "SELECT * FROM USER_TAB_COLS WHERE TABLE_NAME = '" & strtabelle & "' ORDER BY COLUMN_ID"
set rs = new adodb.recordset
rs.open conn, SQL, adopenforwardonly, adlockreadonly

do until rs.eof
    for i = 0 to rs.fields.count - 1
       debug.print rs.fields(i).name & ": " & vbtab & rs.fields(i).value
    next i
   debug.print
rs.movenext
Loop

rs.close
set rs = nothing

Als Ergebnis solltest Du neben viel Oracle-spezifischem Kram alles sehen können, was Du für das Anlegen des Access-Tabelle brauchst, Spaltennamen, Datentyp etc...