openoffice-users-de mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "E.J.Minhorst" <s...@ejomi.de>
Subject Re: Accsess Datenbank importieren
Date Fri, 22 Mar 2013 10:38:56 GMT
Am Do, 21.03.2013, 16:08 schrieb Alfred Ocenasek:
> Hallo, habe mir soeben Apache Open Office für Apple heruntergeladen. Es
> wurde mir gesagt, dass ich damit auch Windows-Accsess-Datenbanken
> importieren und bearbeiten kann. Nun finde ich keine Dokumentation wie ich
> das handeln soll. Kann mir jemand helfen?
> AO
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-de-unsubscribe@openoffice.apache.org
> For additional commands, e-mail: users-de-help@openoffice.apache.org
>
Hallo Alfred!

Aus eigener Erfahrung mit Anbindungen von ACCESS-Datenbanken unter Windwos
kann ich berichten, dass die ODBC-Anbindung mit OO zwar ganz gut klappt
aber je nach Datenbank-Inhalt und verwendetem Zeichensatz nicht alle
Sonderzeichen und Symbole korrekt unter OO dargestellt werden.

Auch das nachträgliche Ändern des Datenbank-Layouts der MDB-Datei unter
OO funktioniert ebenfalls nicht bzw. oft fehlerhaft, d.h. solche Änderungen
sollten grundsätzlich nur in der ACCESS-Umgebung gemacht werden!

Datenbank-Inhalte in die OO-eigene HSQL-Datenbank zu importieren funktioniert
leider nur über den Umweg eines Textdaten-Imports, weil HSQL den SQL-Befehl
"COPY TableName (...) FROM 'SourceFile' DELIMITERS ';' CSV;" nicht kennt!

Der Import in eine PostGres-DB funktioniert mit diesem Ausdruck prima,
man muß aber auch hier auf den richtigen Zeichensatz achten - ältere
ACCESS-Versionen exportieren kein UTF-8, d.h. Darstellungsprobleme unter OO!

In beiden Fällen muss zunächst der Datenbank-Inhalt von ACCESS als reine
Textdatei exportiert werden (= betreffende Tabelle anklicken, rechte Maus-
taste Kontextmenü "Exportieren", Dateityp "Textdateien *.txt; *.csv: *.tab).

Weil OO am liebsten UTF-8 kodierte Daten möchte, muß umgefort werden. Zur
Datenumformung gibt es diverse Freeware-Programme (z.B. "MOJICOCO").

Die so vorbereitete Textdatei kann dann unter OO mit den SimpleFileAccess-
Methoden z.B. in einen Array zwischengespeichert werden und anschliessend
mit den SQL-Statement "INSERT INTO" in die HSQL-Datenbank importiert werden
oder mit "COPY" zum externen Datenbank-Server (z.B. PGSQL) geschickt werden.

Hat man das geschafft, kann man natürlich den BASIC-Code zum Importieren
wieder löschen um lokal Ressourcen zu sparen. Ab dann kann man ganz normal
unter OO mit den importieren Daten arbeiten - eine Rückkoplung zu den
Ursprungsdaten von ACCESS ist dann natürlich  N I C H T  mehr gegeben!

Die SQL-Abfragen zum Einfuegen von Daten in die HSQL-Datenbank sind
nicht ganz einfach - wer sich aber ein bißchen in das Thema hineinfizzt,
wird schon irgendwann zurecht kommen!

Nachfolgend habe ich mal einen Prinzip-Code einkopiert, der alle wichtigen
Datenbank-Aktionen zum HSQL-Befüllen zeigt. Viel Spaß beim Ausprobieren
und tüfteln!

Gruß: Ernst

' Tabellen-Name golbal vordefinieren:
Global Const TableName As String = "MyHsqlTable"
' Ein Daten-Array zum Einfuegen von DB-Daten (als Beispiel):
Global aDataArray(100, 4)
' Global verfuegbare Handler zur Datenbank-Verbindung:
Global BaseConnection, BaseStatement

Sub Main()
    Dim i As Integer
    ' Datenbank-Verbindung aufbauen:
    If ConnectBase() = True Then
        'Tabelle erzeugen:
        BaseStatement.Execute (CreateTable(TableName))
	' Alle Daten aus dem Array in die Tabelle einfuegen:
        For i = =LBound(aDataArray) To UBound(aDataArray)
            ' Zuerst die Datenzeile als SQL-String vorbereiten:
            SQL = PrepareInserts(TableName, aDataArray(i, 0),
aDataArray(i, 1), aDataArray(i, 2), aDataArray(i, 3))
            ' Dann das SQL-Kommando zum Einfuegen ausfuehren:
            BaseStatement.executeUpdate (SQL)
        Next
        ' Datenbank-Verbindung schliessen:
        DisconnectBase
    End If
End Sub

Function PrepareInserts(TableName, sStringVar As String, iNumericVar As
Integer, lNumericVar As Long, dDateVar As Date)
    Dim sSQL As String
    Const TableName = "permit"
    sSQL = "INSERT INTO " & TableName & " (" & _
        "datastring, " & _
        "littlenumber, " & _
        "bignumber, " & _
        "datestring) " & _
        "VALUES(" & _
        "'" & sStringVar & "'," & _
        "'" & iNumericVar & "'," & _
        "'" & lNumericVar & "'," & _
        "'" & dDateVar & "'" & _
        ");"
    PrepareInserts = sSQL
End Function

Function CreateTable(TableName)
    Dim sSQL As String
    ' Achtung: Das Feld "dataid" ist ein Auto-Increment Feld fuer HSQL!
    sSQL = "CREATE TABLE " & TableName & " (" & _
        "dataid INTEGER NOT NULL IDENTITY, " & _
        "datastring VARCHAR(40), " & _
        "littlenumber SMALLINT, " & _
        "bignumber BIGINT, " & _
        "datestring TIMESTAMP, " & _
        ");"
    CreateTable = sSQL

End Function

Function ConnectBase() As Boolean
    BaseConnection = GetConnectionHSQL()
    If Not IsNull(BaseConnection) Then
        MsgBox "Datenbankverbindung hergestellt."
        BaseStatement = BaseConnection.createStatement()
        ConnectBase = True
    Else
        MsgBox "Datenbankverbindung konnte nicht hergestellt werden!"
    End If
End Function

Function GetConnectionHSQL()
    Dim sURL As String, oDatabaseContext, oDataSource, oConnection,
oInteraction, sPathToMyBase, sRegisteredBaseName
    ' ACHTUNG - BITTE ANPASSEN: Standort (Pfad) dieser Base-Datenbank bzw.
registrierter DB-Name:
    sPathToMyBase = "C:\Dokumente und
Einstellungen\%USERNAME%\MeineDatenbanken\DieseDatenbank.odb"
    sRegisteredBaseName = "MYTESTDATABASE"
    ' Kontext fuer Datenbankverbindungen bereitstellen:
    oDatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
    ' Datenquelle über seinen registrierten Namen definieren:
        'oDataSource = oDatabaseContext.getByName(RegisteredBaseName)
    ' Datenquelle über den eigenen, absoluten  U R L - P f a d  definieren:
        sURL = ConvertToURL(sPathToMyBase)
        oDataSource = oDatabaseContext.getByName(sURL)
    ' Verbindung herstellen (mit oer oder Anmelde-Menue):
    If Not oDataSource.IsPasswordRequired Then
        oConnection = oDataSource.GetConnection("", "")
    Else
        oInteraction =
createUnoService("com.sun.star.sdb.InteractionHandler")
        oConnection = oDataSource.ConnectWithCompletion(oInteraction)
    End If
    GetConnectionHSQL = oConnection
End Function

Function DisconnectBase()
    On Error GoTo DisConErr
    BaseStatement.dispose
    BaseConnection.close()
    BaseConnection.dispose
Exit Function
DisConErr:
    MsgBox "Datenbankverbindung konnte nicht getrennt werden!"
End Function


---------------------------------------------------------------------
To unsubscribe, e-mail: users-de-unsubscribe@openoffice.apache.org
For additional commands, e-mail: users-de-help@openoffice.apache.org


Mime
View raw message