2016-07-12 9 views
0

Oracleに接続するために作成したPerlスクリプトがあります。このスクリプトはPERL64がインストールされたマシン上で完璧に動作します。私はこのスクリプトをActiveState PerlAppを使ってEXEに変えようとしました。もう一度、私のマシン上で完全に動作します。実行可能ファイルがPerlを含まないマシンに置かれると、Oracleに接続するために必要なDLLがありません。Windows実行ファイルとしてコンパイルされたPerlスクリプトがOracleに接続しません

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"; 
} 

私が受け取るエラーは、次のとおりです。

はモジュールDBD :: Oracleの 'オート/ DBD /オラクル/ Oracle.dll' をロードできません:LOAD_FILE:指定されたモジュールはで見つけることができませんでした事前に/DynaLoader.pmラインは224

おかげ

+0

私はPerlAppを使ったことがありませんが、[docs](http://docs.activestate.com/pdk/6.0/PerlApp.html#perlapp__2d_2dbind_file)は、あなたが '--bind'オプションを使用できることを示唆しています追加のDLLを含めることができます。ロードするためにコードを必要とするのか、それとも自動的に見つかるのかどうかはわかりません。 –

+0

bindオプションを試しましたが、dllをインクルードしてtempディレクトリにスローするように見えます。しかし、アプリはそれがそこにあることを知らない。 –

答えて

1

が2例あります

  • ターゲットマシンにDLLファイルを持っていないと、動作しません。 DLLファイルは実行可能ファイルにリンクされていません(DLLは静的ライブラリではなくダイナミックリンクライブラリです)
  • ターゲットマシンにDLLファイルがありますが、見つからない場合はいくつかの可能な説明。たとえば、ファイルがPATHにない可能性があります。または、ファイルが適切なアクセス許可を持っていない可能性があります。特に、サービスのようなものから実行ファイルを呼び出す場合(デフォルトでは異なるアクセス許可を持つシステムアカウントで実行されます)。

また、WindowはDLLファイルについて少し気になります。 Oracle.dllが見つからないと言われるかもしれませんが、実際には欠落しているものはその依存関係の1つです。たぶんOCI.dll? 同じ名前のDLLファイルが複数ある場合は、適切なバージョンではない可能性があるため、どのDLLファイルが読み込まれているかを確認してください。

ファイルが存在する場合、それらのファイルは1つしかなく、PATHにあり、それでも見つからない場合は、必要なDLLに対してregsvr32コマンドを実行して手動でファイルを登録してみてください。

+0

実行ファイルにそれらをまとめる方法はありませんか? –

+0

これを行うには、Oracleスタティック・ライブラリが必要ですが、最近変更されたものを除き、OracleはWindows用のスタティック・ライブラリを提供していません。 https://community.oracle.com/thread/2495648?tstart=0を参照してください。 (そして、それらを持っていても、これはVisual C++で構築された標準のC/C++アプリケーションではありません) – ChatterOne

+0

このオプションを使用するとどうなりますかDLLを組み合わせるために別のスクリプトで検出しました** - PerlEz.dll [file = \ perl \ bin \ PerlEz.dll、extract] ** –

1

EXEを実行しているマシンにOracleクライアントを個別にインストールする必要があります。

ActiveStateのPDKのPerlAppは、Oracleの再配布契約に違反するため、OracleクライアントをEXEにラップしません。

関連する問題