在用连接oracle数据库的时候,经常会碰到如下问题:
VS2010 + Oracle driver: ORA-12154: TSN:could not resolve the connect identifier specified
比较好的解决方案,是引用oracle dll 文件连接oralce数据库,而不用依赖于安装的oralce client.
步骤如下:
1. 从'Oracle Data Provider for .NET' 获取DLLs包
可以到 http://www.oracle.com/technetwork/topics/dotnet/index-085163.html 下载oracle 安装文件。
2.引用DLLS到项目
搜索Oracle客户端的安装目录,并将下列四个DLL复制到项目的Bin文件夹:
- Oracle.DataAccess.dll
- oci.dll
- oraciicus11.dll
- OraOps11w.dll
引用dll文件,Project --> Add Reference..., 点击 Browse 选择 Oracle.DataAccess.dll 文件.
在Oracle.DataAccess.dll 的Copy to Output Directory属性中,设置 Copy always.
3.用全连接字符串
为了不必担心应用程序部署时TNS的设置问题,可以用整个连接字符串如下:
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=servername)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=servicename)));User Id=username;Password=********;
例如:
using System; using System.Data; using Oracle.DataAccess.Client; static class Program { [STAThread] static void Main() { TestOracle(); } private static void TestOracle() { string connString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)" + "(HOST=servername)(PORT=1521)))" + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=servicename)));"+ "User Id=username;Password=********;"; using (OracleConnection conn = new OracleConnection(connString)) { string sqlSelect = "SELECT * FROM TEST_TABLE"; using (OracleDataAdapter da = new OracleDataAdapter(sqlSelect, conn)) { var table = new DataTable(); da.Fill(table); if (table.Rows.Count > 1) Console.WriteLine("Successfully read oracle."); } } } }
注:
如果系统是X64位,用32的Oracle.DataAccess.dll 可能会出现如下问题:
Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.
解决方法:
设置Pool支持32位,如下: