应用连接Oracle失败报80004005的原因之一

近来看统计的Reference,总有搜oracle/oci等误入此窝的.
为了假装此窝,顺便再贴一个和老旧服务器相关的故事.
使用ODAC9/10来代替Oracle客户端部署应用,相对于使用Instant Client的要啥没啥(没有OLEDB,而且居然没Home)的不便,同时相对于Oracle Client牵葫芦带瓢的不爽,是个很好的均衡方案.
ODAC里面附带的OLE Provider是OraOLEDB.Oracle.1,相对于微软的MSDAORA来说,前者的性能较优,而且后者在BLOB等存取中还存在已知问题,使用OLEDB连接Oracle的程序员很多使用此Provider,但总有写程序的人通过其他类库用OLEDB,或者在程序内使用立即字符串MSDAORA来合成连接字串,而不是在配置中指定Provider.
那么问题来了,通常这类程序喜欢华丽地扔出一个80004005的错误,05年我遇见这个时候(某次自定义安装客户端,只选了OLEDB和配置程序),因为看到出错信息里面是提到没有从Oracle返回具体错误类型,就想当然认为不是Provider初始化失败,而以为那几个程序不使用OLEDB,重新将客户端典型安装了事.
等我发现除了原装的Oracle OLEDB Privider,系统中居然还有一个MSDAORA,已经是一年以后的事情了,这个Privider是基于MSDTC的配置,依赖于oracle 8的dll模块,要么是给他提供8的dll(客户端好像有DTC项),要么是让其使用当前Oracle版本的dll,参考的数据是M$的文档,头条就是此问题.

做如下修改:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI
OracleOciLib = oci.dll
OracleSqlLib = orasql9.dll
OracleXaLib = oraclient9.dll

我的数据库服务器只能装9,所以网站和应用服务器上装的是ODAC 92070,这样修改后,不用安装9201客户端,MSDAORA就可以使用了.

此类问题特征: 在Microsoft OLE Provider for Oracle里面,测试连接失败,此为充分条件
使用LordPE或者PETools等查看模块的工具,查看其中加载了oledb32.dll,此为使用了OLEDB的程序,此为必要条件;如果又有msado15.dll,则为通过ado使用OLEDB的程序.
然后使用UltraEdit打开程序查找MSDAORA,为不充分条件.
至此启动此程序,会光荣的报错,可服上剂.