経緯
Windows Server 2003からWindows Server 2008R2にIIS上の既存Webアプリケーションの移行作業をしていたところ、500エラーとなりIISログに「プロバイダーが見つかりません。正しくインストールされていない可能性があります。」というエラーが出力されていた。
データベース(SQLServer)への接続が出来ないのがエラーの原因のようだ。
接続文字列の確認
ConnectionString = "Provider=SQLNCLI.1 …"
プロバイダー名に「.1」が付いていたので、これが怪しいと思った。
そもそも「.1」の意味を理解出来ていない、検索してみたことろ下記サイトがヒット。
「SQLOLEDB.1」と「SQLOLEDB」の違い
簡単に言えばバージョンです。 .1 を指定すれば明示的にバージョンを指定していることになります。 特定のバージョンに拘らないのであれば必要ありません。
バージョンということが分かったが、何のバージョン? もう少し調べてみる。
Connection String Syntax - MSDN
If two versions of a provider are installed on the same system, use the ProgID to specify exactly which version to use.
プロバイダの2つのバージョンが同じシステムにインストールされている場合、プログラムIDは正確に使用するバージョンを指定するために使用します。
その場合にレジストリの「HKEY_CLASSES_ROOT」には、下記のように2種類登録(例)されている。
HKEY_CLASSES_ROOT\SQLOLEDB
HKEY_CLASSES_ROOT\SQLOLEDB.1
そもそも「.1」を意識して付けることは無い気がする。きっとツールを使ったか、どこかのサイトを参考にでもしたんだろう。
特定のバージョンに拘らないならば不要ということで、「.1」は消して動かしてみた。
しかし、結果は変わらず同じエラーになってしまった。
調査ふりだし
32bitから64bitに変更したことが原因では無いかと思った。
以前OracleでClassic ASPにてデータベースを接続させた際には、32bit版のOracle Clientをインストールする必要があったためだ。また、IIS上の設定でも「32 ビットアプリケーションの有効化」を「True」にする必要がある。
SQLServerでも同様では無いかと思ったが、「x64 バージョンと Itanium バージョンの sqlncli.msi では、32 ビット バージョンの SQL Server Native Client もインストールされます。」との記述があり、32bit版ODBC データ ソース アドミニとレーター(%windir%\SysWOW64\odbcad32.exe)で確認してもドライバーは入っていることを確認した。
解決
IISの問題なのかデータベース接続が問題なのか切り分けする為に、VBScriptにデータベース接続部分を転記してデスクトップ上から確認すると、64bit上でも同じエラーが表示された。
よって、接続文字列が怪しいとして再度、見直すことにした。
するとドライバーのバージョンによってプロバイダー名が違っていた。
SQLServerの接続ドライバーは最新版(SQLServer 2014 Express)を導入。
Microsoft SQL Server 2005 Native Client (SQLNCLI – sqlncli.dll)
Microsoft SQL Server 2008 Native Client (SQLNCLI Ver.10 – sqlncli10.dll)
Microsoft SQL Server 2012 Native Client (SQLNCLI Ver.11 – sqlncli11.dll)
※SQLServer 2014は、SQL Server 2012 Native Clientを使用する。
プロバイダー名を「SQLNCLI11」に変更したところ正常に接続することが出来た。
ConnectionString = "Provider=SQLNCLI11 …"