# ODBC-Bridge erzeugen



## dadom110 (6. März 2006)

Moin zusammen,

konnte bei meiner Suche im Internet nichts passendes finden. Das Einrichten einer ODBC Bridge bei WindowsXP geht ohne Probleme, aber ist es möglich diese Einrichtung dynamisch über den Programmcode machen zu lassen?

Mfg
dom


----------



## Thomas Darimont (6. März 2006)

Hallo!

Das ginge über einen Umweg:

```
/**
 * 
 */
package de.tutorials;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;

/**
 * @author Tom
 * 
 */
public class RegisterMSAccessDatabaseAsODBCDataSource {

    /**
     * @param args
     */
    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        String dataSourceName = "tutorialsDE";
        String dataSourceLocation = "C:/Programme/Microsoft Office/Office/Samples/Nordwind.mdb";

        ProcessBuilder processBuilder = new ProcessBuilder(
                "c:/windows/system32/odbcconf.exe /a {CONFIGSYSDSN \"Microsoft Access Driver (*.mdb)\" \"DSN=tutorialsDE;DBQ=C:/Programme/Microsoft Office/Office/Samples/Nordwind.mdb\"}"
                        .split(" "));

        Process process = processBuilder.start();

        if (0 == process.waitFor()) {
            System.out.println("DSN created!");
        }

        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection connection = DriverManager.getConnection("jdbc:odbc:"
                + dataSourceName, "Administrator", "");

        Statement statement = connection.createStatement();

        ResultSet resultSet = statement.executeQuery("SELECT * FROM Kunden");
        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
        int columnCount = resultSetMetaData.getColumnCount();

        while (resultSet.next()) {
            for (int i = 1; i <= columnCount; i++) {
                System.out.print(resultSet.getString(i));
                System.out.print(" ");
            }
            System.out.println();
        }

        resultSet.close();

        statement.close();

        connection.close();
    }

}
```

Gruß Tom


----------



## dadom110 (7. März 2006)

Moin Thomas, 

das funktioniert, hatte erst ein paar Probleme, weil ich den Pfad den ich übergeb mit nem FileChooser auswähle, das hat dann nicht geklappt, dafür musste ich erst den gesamten String in eine Variable packen und dann den "split" machen.


```
String connect="c:/windows/system32/odbcconf.exe /a {CONFIGSYSDSN \"Microsoft Access Driver (*.mdb)\" \"DSN=movdb;DBQ="+file.getSelectedFile().toString()+"\"}";
ProcessBuilder processBuilder = new ProcessBuilder(connect.split(" "));
Process process = processBuilder.start();
......
```

Hast du vielleicht noch eine Minute mir die funktionsweise des Aufbaus zu erklären? Mir ist klar das du die odbcconf.exe aufrufst und ihr parameter übergibst (kann man so was nachgucken, welche Parameter eine *.exe Datei übergeben werden könnnen?), aber was macht der "split" Befehlt am Ende, der mir scheinbar so viele Probleme bereitet hat. Er teilt den übergebenen String jeweils an einem Leerstring, das heisst er übergibt der *.exe nicht einen String, sondern viele kleine? Und warum teilt er dann nicht den Pfad, wenn dieser einen Leerzeichen enthält (der FileChooser (file) liefert bsp: C:/Meine Dateien/DB.mdb , müsste der nicht den String auch teilen und Probleme erzeugen?)

Würde mich, zwecks weiterbildung, über eine kurze Info freuen

Mfg
Dom


----------



## Thomas Darimont (8. März 2006)

Hallo!

Das mit dem Auftrennen, des Strings bei Leerzeichen ist eben eine Eigenart beim ProcessBuilder/Runtime.exec... die kommen mit Leerzeichen innerhalb eines Kommandos, wenn sie diese Intern selbst setzen koennen...

Gruss Tom


----------

