Java ODBC-Zugriff auf x64-Windows / Advantage Database Server

64 Bit ist ein Trend, der nicht mehr aufzuhalten ist. Endlich ist die 3GB-Grenze auf den Clientbetriebssystemen Geschichte.
Mit Windows 7×64 habe ich auch meine Programmierumgebung auf 64 Bit umgestellt – damit gingen meine Probleme los.

Bisher habe ich mit Java und ODBC auf meine ADS-DBF-Dateien zugegriffen mit folgender Konfiguration:

Unter Windows 7 funktionierte die Datenbankanbindung jedoch nicht mehr. Erste Hürde: Installation eines 32-Bit ODBC-Treibers.
Es gibt unter Windows 7 64 Bit die ODBC-Verwaltung in 32 und in 64 Bit:

ODBC Datenquellenadministrator 32 Bit:
c:\windows\SysWOW64\odbcad32.exe

ODBC Datenquellenadministrator 64 Bit:
c:\windows\System32\odbcad32.exe

Die ODBC-Verbindung klappt jedoch nur in Kombination mit 32 Bit Java und 32 Bit ODBC. Auf reiner 64-Bit Ebene funktioniert die Verbindung nicht.
Es kommt folgende Fehlermeldung:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Der angegebene DSN weist eine nicht übereinstimmende Architektur von Treiber und Anwendung auf.
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcConnection.initialize(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at rentasad.lib.db.ODBCConnection.connect(ODBCConnection.java:68)
at rentasad.lib.db.ODBCConnection.(ODBCConnection.java:29)
at rentasad.main.KreditkartenZuDTIGenerator.main(KreditkartenZuDTIGenerator.java:45)

Diese Fehlermeldung lässt sich jedoch ziemlich einfach beheben.

Es muss ein 32 Bit JDK installiert werden. Dieses wird zum Ausführen der Java-Applikation verwendet.
Einrichtung eines 32-Bit SDKs für eine Applikation

Verbinden einer ADS-Datenbank per ODBC vom Webserver

Zur Zeit programmiere ich einen Zugriff auf unseren ADS-Datenbankserver, um damit Abfragen zu schreiben und zu exportieren.

Über den Aufruf meiner Skripte per DOS-Konsole hat das bisher ohne Probleme geklappt. Ich bediene mich der PHP-PEAR-Klassen:

require_once (‘DB.php’);
error_reporting(E_ALL);
$dsn = ‘odbc:///f991’; // DSN-Name

$dbODBC = DB :: connect($dsn); // CONNECT herstellen

if (true == DB :: isError($dbODBC))
{
die($dbODBC->getMessage());
}
else
{
echo “Connect erfolgreich”;
}

Als Output erhalte ich: “DB Error: connect failed

Wenn ich es allerdings vom DOS-Fenster aus starte, geht es ohne Probleme und die Verbindung wird hergestellt:
v:\XAMPP\php\php.exe” “index.php”

Erst dachte ich, es liegt vielleicht daran, dass XAMPP als Dienst läuft und ODBC nicht auf Benutzer-DSNs zugreifen kann und habe es als System-DSN angelegt.

Ergebnis: Das Gleiche, von DOS gehts, aber von einem Webserver nicht.

Daraufhin habe ich mal das ODBC-Objekt wie folgt näher ausgegeben

PHP-Code:
print_r($dbODBC);

und das hat das folgende Ergebnis gebracht:

Auschnitt aus Output:

Zitat:
[nativecode=HY000 [iAnywhere Solutions][Advantage SQL][ASA] Error 5185: Local server connections are restricted in this environment. See the 5185 error code documentation for details. axServerConnect]

Dadurch bin ich auf den folgenden Link gestoßen:
Advantage Database Architect über Remote Desktop � Das nie endende Chaos!
Ich bin so frei und zitiere daraus:

Zitat:
Wenn der Advantage Database Architect beim Öffnen einer Tabelle die Fehlermeldung “Error 5185: Local server connections are restricted in this environment. See the 5185 error code documentation for details. axServerConnect.” bringt, dann muss nur eine Datei ADS.INI im Verzeichnis der Tabelle mit diesem Inhalt angelegt werden:
[SETTINGS]
MTIER_LOCAL_CONNECTIONS=1

Allerdings hat diese Änderung bei mir leider nicht zum erwünschten Ergebnis geführt. Wenn jemand von Euch noch eine Idee hat, ich werde auch weitersuchen und die Lösung, so ich sie finde, hier veröffentlichen.

Ein bisschen googlen brachte mich dann darauf, dass ich möglicherweise ein Lizenzproblem habe:

Zitat:
IMPORTANT
Pursuant to iAnyWhere’s licensing agreement, … if an application is distributed to work without the Advantage Database Server (i.e., it uses the Advantage Local Server to access data), the application must act as a “client” that directly accesses and uses the data. To be specific, only computers that have the Advantage Local Server DLL loaded into memory can have access to the data that is obtained by that Advantage Local Server DLL. The application cannot act as “middleware” or as a “server” by having the data forwarded by any means to a separate computer. In other words, it is illegal to use the Advantage Local Server with a Web server, an application server, a terminal server, or any other type of middleware or server product to access data on behalf of remote computers. An Advantage Database Server (a.k.a. remote server) product must be purchased and used to allow this SOFTWARE PRODUCT to access data on behalf of applications running on remote computers.

Der ADS-Server verhindert aus lizenzrechtlichen Gründen den Zugriff von Webservern auf die Datenbank. Aus diesem Grund funktioniert das PHP-Modul nicht. Wie man es dafür aber zum Laufen bekommt, ist mir unbekannt. Gelöst habe ich das Problem nicht, aber umgangen habe ich es, indem ich ein Modul programmiert habe, welches die ADS-Datenbanktabellen in MySQL überträgt.

Eine weitere PHP-Library führt über ODBC die Anfragen aus und speichert die Ergebnisse serialisiert in der Datenbank ab, so dass der Webserver auf diese zugreifen kann.