Oracle新手在VS2015中添加Oracle连接遇BadImageFormatException问题求助
嘿,我来帮你拆解下这个问题,核心是位数不匹配和正确选择官方数据提供程序这两个关键点,咱们一步步来解决:
一、先搞定BadImageFormatException错误
这个错误的根源很明确:你装的是64位ODAC,但VS2015的服务器资源管理器默认是以32位进程运行的,导致它试图加载32位Oracle组件,和你现存的64位组件不兼容。
解决方法有两个,推荐第一个:
- 让VS以64位模式启动:右键你的VS2015快捷方式→属性→兼容性,勾选「以管理员身份运行此程序」,然后在「目标」输入框的末尾(注意和原有内容之间加空格)加上
/use64bitdevenv,比如:
重启VS后,服务器资源管理器就会以64位模式运行,能正常加载你的64位ODAC组件了。"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe" /use64bitdevenv - 如果不想改VS启动模式,也可以补充安装32位ODAC,但这样会同时存在32/64位组件,后续可能带来其他兼容性问题,所以优先推荐第一种方案。
二、选择正确的数据提供程序
你之前选的.NET Framework Data Provider for Oracle确实是微软弃用的旧组件,官方早就不维护了,应该用Oracle自带的ODP.NET(Oracle Data Provider for .NET)——也就是你装的ODAC里包含的Oracle Developer Tools for Visual Studio对应的提供程序。
操作步骤:
- 重启VS(装完ODAC后必须重启才会加载新组件);
- 在服务器资源管理器里点击「添加连接」,选择数据源为
Oracle Database (Oracle ODP.NET); - 这个提供程序是官方支持的,完美适配EF6,后续配置Entity Framework也会顺畅很多。
三、用TNSNames文件定义连接字符串的正确姿势
首先确认你的TNSNames.ora文件位置:64位ODAC默认安装路径一般是C:\app\<你的Windows用户名>\product\12.2.0\client_1\network\admin\tnsnames.ora,如果找不到,可以在命令行执行tnsping <数据库别名>来定位。
TNSNames的标准格式示例:
# 自定义的数据库别名,比如ORCL_REMOTE ORCL_REMOTE = (DESCRIPTION = (ADDRESS_LIST = # 远程数据库的IP/主机名和端口,默认1521 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) ) (CONNECT_DATA = # 替换成你的数据库服务名,注意不是SID(如果不确定,看SQL Developer里的连接配置) (SERVICE_NAME = ORCL) ) )
配置好TNSNames后,在VS的连接对话框里,「服务器名」直接填你定义的别名(比如ORCL_REMOTE),输入用户名和密码就能连接了。
另外,如果你不想依赖TNSNames文件,也可以直接把TNS内容写进连接字符串,格式如下:
Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=远程IP)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=数据库服务名)));User Id=你的用户名;Password=你的密码;
四、后续EF6配置小提示
用ODP.NET配置EF6时,需要在项目的App.config/Web.config里添加Oracle的EF提供器配置,示例如下:
<entityFramework> <providers> <provider invariantName="Oracle.DataAccess.Client" type="Oracle.DataAccess.EntityFramework.EFOracleProviderServices, Oracle.DataAccess.EntityFramework, Version=12.2.0.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </providers> </entityFramework>
这样EF就能识别并使用Oracle的官方提供器了。
内容的提问来源于stack exchange,提问作者Guy E

