2016-07-12 3 views
0

Ich habe ein Perl-Skript, das ich geschrieben habe und das mit Oracle verbindet. Das Skript funktioniert perfekt auf meinem Computer mit PERL64 installiert. Ich habe versucht, dieses Skript mit ActiveState PerlApp in eine EXE zu verwandeln. Auch hier funktioniert es perfekt auf meiner Maschine. Sobald sich die ausführbare Datei auf einem Computer befindet, der kein Perl enthält, fehlen DLLs, die für die Verbindung mit Oracle erforderlich sind.Perl-Skript, kompiliert als ausführbare Windows-Datei, stellt keine Verbindung zu Oracle her

use DBI; 

    # CONFIG VARIABLES 
our $database = "database.app.net"; 
our $host = "server.app.net"; 
our $port = "1522"; 
our $user = "SVC_app"; 
our $pw = 'Password'; 

# DATA SOURCE NAME 
our $dsn = "dbi:Oracle:$host:$port/$database"; 

# PERL DBI CONNECT 
our $connect = DBI->connect($dsn, $user, $pw); 

# PREPARE THE QUERY 
our $query = 'SELECT Blah FROM database."table" where "blah" = ?'; 
our $query_handle = $connect->prepare($query); 

# EXECUTE THE QUERY 
$query_handle->execute($value); 

# BIND TABLE COLUMNS TO VARIABLES 
$query_handle->bind_columns(undef, \$return); 

# LOOP THROUGH RESULTS 
while($query_handle->fetch()) { 
    #print "$return"; 
} 

Der Fehler, den ich erhalten ist:

nicht 'auto/DBD/Oracle/Oracle.dll' für Modul DBD :: Oracle laden kann: load_file: Das angegebene Modul konnte nicht gefunden werden auf /DynaLoader.pm Linie 224.

Vielen Dank im Voraus

+0

Ich habe noch nie PerlApp verwendet, aber [die Dokumente] (http://docs.activestate.com/pdk/6.0/PerlApp.html#perlapp__2d_2dbind_file) schlagen vor, dass Sie möglicherweise die Option '--bind' verwenden können um zusätzliche DLLs hinzuzufügen. Ich bin mir nicht sicher, ob Sie dann Code benötigen, um sie zu laden oder ob sie automatisch gefunden werden. –

+0

Ich habe versucht, die Option binden, scheint es, um die DLL enthalten und werfen Sie es in das Temp-Verzeichnis. Aber die App weiß nicht, dass es da ist. –

Antwort

1

Es gibt zwei Fälle:

  • Wenn Sie die DLL-Dateien NICHT auf dem Zielcomputer haben, wird es nicht funktionieren. DLL-Dateien sind nicht in den ausführbaren Dateien verknüpft (wie der Name sagt, sie sind Dynamic Link Libraries, nicht statische Bibliotheken)
  • Wenn Sie die DLL-Dateien auf dem Zielcomputer haben, aber sie nicht gefunden werden, dann gibt es ein paar mögliche Erklärungen. Die Dateien befinden sich beispielsweise möglicherweise nicht im PATH. Oder die Dateien verfügen möglicherweise nicht über die richtigen Berechtigungen, besonders wenn Sie Ihre ausführbare Datei von einem Dienst aufrufen (der standardmäßig auf einem Systemkonto ausgeführt wird, das über andere Berechtigungen verfügt).

Beachten Sie auch, dass Windows ein bisschen wählerisch über DLL-Dateien ist. Es kann sagen, dass Oracle.dll fehlt, aber was tatsächlich fehlt, kann eine seiner Abhängigkeiten sein. Vielleicht OCI.dll? Und wenn Sie mehr als eine DLL-Datei mit dem gleichen Namen haben, versuchen Sie und stellen Sie sicher, welche geladen ist, weil es möglicherweise nicht die richtige Version ist. Wenn die Dateien vorhanden sind, gibt es nur eine Version von ihnen, sie befinden sich im PATH und können sie trotzdem nicht finden. Sie können versuchen, die Dateien manuell zu registrieren, indem Sie den Befehl regsvr32 für die erforderliche DLL ausführen.

+0

Es gibt keine Möglichkeit, sie in der ausführbaren Datei einzupacken? –

+0

Um dies zu tun, würden Sie statische Oracle-Bibliotheken benötigen. Wenn sich jedoch in letzter Zeit nichts geändert hat, stellt Oracle keine statischen Bibliotheken für Windows bereit. Siehe https://community.oracle.com/thread/2495648?tstart=0. (Und selbst mit ihnen, ist dies nicht eine Standard-C/C++ - Anwendung mit Visual C++ gebaut) – ChatterOne

+0

Was ist mit dieser Option habe ich entdeckt auf einem anderen Skript zu kombinieren DLLs ** - binden PerlEz.dll [file = \ perl \ bin \ PerlEz.dll, Auszug] ** –

1

Sie müssen den Oracle-Client auf jedem Computer, auf dem Sie die EXE ausführen, separat installieren.

PerlApp im ActiveState-PDK wird Oracle-Clients nicht in die EXE einschließen, da dies die Neuverteilungsvereinbarung von Oracle verletzen würde.

Verwandte Themen