0

数年前、MicrosoftACEとJETOLEDBを使用してExcelスプレッドシートをCSVファイルに変換するC#.NETプログラムを作成しました。最近、Windows Server2008x64サーバーにアップグレードしました。JETが非推奨になったため、そのメソッドは機能しなくなりました。元々、Excel 2003の.xlsファイルはJETで処理され、.xlsxExcel2007ファイルはACEで処理されていました。両方にACEを使用するように接続文字列を変更しました。

これで、コマンドプロンプトからプログラムを正常に実行できます。ただし、自動化ソフトウェア(Start-> Runメソッドと同様のプログラムを実行しているようです)を使用すると、MicrosoftDataAccessコンポーネントがインストールされていないというエラーが表示されます。これらを調査したところ、32ビットシステムでのみ動作し、WindowsServer2000以降はサポートされていないようです。

何か案は?最新のベータ版x64ACEOLEDBドライバーがインストールされています。プログラムは手動で正常に実行されます。また、x86のターゲットプラットフォームでプログラムをコンパイルしてみました。また、自動化ソフトウェアが使用するWindowsアカウントを使用して、プログラムを手動で正常に実行しました。

4

1 に答える 1

1

64ビットWindowsでは、プロセスはビット数(32または64)を定義します。

プログラムを64ビットモードで起動し、そのプログラムがCOMを実行する場合(OLEDBはCOMベース)、COM 64ビットDLLのみを検索します(実際、レジストリの64ビット側のみを使用します。 -ビットCOMコンポーネントが登録されます)。

プログラムを32ビットモードで起動し、そのプログラムがCOMを実行する場合、COM32ビットDLLのみが検索されます。

現在、C#コンパイラのバージョンに依存する可能性がありますが、現在、ほとんどのC#プログラムは「任意のCPU」としてコンパイルされるように構成されています。これは、32ビットOSでは32、64ビットOSでは64として実行されることを意味します。これにより、COMを直接または間接的に使用する場合は非常に複雑になります(COMを使用していることさえ知らない場合もあります)。 。

だから...要約すると:

1)プロセスのビット数を決定します(タスクマネージャーで簡単に、64ビットマシン上の32ビットプロセスには「* 32」の接尾辞が付きます)。

2)対応するCOMOLEDBドライバーをインストールします。

OLEDBドライバーが64ビットモードで存在しない場合は、C#.EXEを再コンパイルするか、パッチを適用して32ビットモードを強制する必要があります。これには、 CORFLAGSツールを使用できます。

于 2010-12-02T21:29:59.187 に答える