使用 .NET 应用程序连接 Oracle 数据库

最近又被同学问起为何 .NET 应用程序连接 Oracle 数据库总是出错?,我想,这是因为我们平常都是使用微软的产品,而缺少对其它平台产品的研究。下面我就具体说说如何正确的配置 Oracle 以适应 .NET 应用开发。

一、下载必需组件
二、开始安装必需组件

1、Oracle 的安装比较简单,直接点击下一步到底就完成安装了。

2、然后,也就是最最关键的一步,配置 Oracle 的listener.ora文件。我的这个文件在C:\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN目录下,如果你把 Oracle 安装在其它地方,请到相关目录查找。找到该文件后,用记事本打开,然后我们需要添加一个SID_DESC节点,该节点内容如下:

(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = C:\oracle\product\11.2.0\dbhome_1)
(SID_NAME = ORCL)
)

然后我们需要添加一个DEFAULT_SERVICE_LISTENER参数配置项,并将其值设为ORCL。如若没有配置此项,那么接下来在调用ODAC组件时将会一直报 ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA 的错误, 切记!切记! 就是这个逼玩意儿,耗了我一天时间,设计这个参数的人 TMD 的脑残!

DEFAULT_SERVICE_LISTENER = ORCL

所以,最终看到的listener.ora文件的内容应该是下面这样的,注意黄色部分:

# listener.ora Network Configuration File: C:\oracle\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = C:\oracle\product\11.2.0\dbhome_1)
(SID_NAME = ORCL)
)
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\oracle\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\oracle\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)

DEFAULT_SERVICE_LISTENER = ORCL

ADR_BASE_LISTENER = C:\oracle

然后,tnsnames.ora文件也应进行相应的修改,修改后如下:

# tnsnames.ora Network Configuration File: C:\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.

ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)

3、然后重启OracleOraDb11g_home1TNSListener服务和OracleServiceORCL服务。

4、接着我们打开sqlplus命令行工具,然后输入/as sysdba以管理员身份登录 Oracle,接着输入startup以启动数据库。正常情况应该是如下图所示:

图 1

可是,如果显示的是下图所示,那该怎么办呢?

图 2

这里推荐一篇我在网上找到的解决方案,地址: http://blog.csdn.net/lpftobetheone/article/details/11099785。大家可以参照这篇文章所述进行修复,注意,该文章的某些地方的描述与截图不符,请大家尽量以截图为准。如果实在不明白可以在下方留言给我。

5、Oracle 安装完了,也配置完了,现在我们需要创建一个表,并插入几条数据。我个人是不喜欢在 sqlplus 里面写 sql 语句,如果你喜欢,那么请直接跳至第 6 步。

1) 解压我们下载的sqldeveloper-4.0.3.16.84-x64.zip压缩包,然后双击里面的sqldeveloper.exe就运行了,然后我们点击下图所示的新建连接的按钮:

图 3

2) 按下图所示输入,然后点击连接:

图 4

3) 然后输入如下 SQL 语句:

--创建suzy用户,密码为:orcl,默认表空间为:users
create user suzy identified by orcl default tablespace users;

--授权suzy用户不限制其表空间的使用
grant unlimited tablespace to suzy;

--授权suzy用户连接权限和资源访问的权限。
grant CONNECT,RESOURCE to suzy;
图 5

4) 然后运行 SQL 语句:

图 6

5) 然后重复第 2) 步以suzy的身份登录:

图 7

6) 然后编写创建表的 SQL 语句并执行:

图 8

7) 然后插入两条记录:

图 8

6、接下来就是安装 ODAC 组件了,先将下载的 ODAC 组件解压到一个目录,比方我这里解压到C:\ODAC112021Xcopy_x64这个目录。

7、在上一步解压的路径下打开命令行,然后输入命令install.bat后回车。我们看到出现了一些命令提示信息,你可以根据你的需要进行选择,这里我选择安装全部 ODAC 组件,并把它安装到C:\odp.net,接着输入如下命令,并等待其完成:

install.bat all C:\odp.net myhome

8、接着打开C:\odp.net可以看到已经创建了很多文件,然后我们在此目录下打开命令窗口,输入命令configure.bat,我们依旧会看到命令提示信息,然后根据提示信息输入如下命令,并等待其完成:

configure.bat all myhome

9、使用 VS 新建控制台项目,然后添加引用C:\Windows\Microsoft.NET\assembly\GAC_64\Oracle.DataAccess\v4.0_4.112.2.0__89b483f429c47342\oracle.dataaccess.dll。当然,如果你的 VS 的 GAC 列表里面有Oracle.DataAccess,你就不需要费劲地跑到 C 盘的 GAC 目录里面去找了,我是因为在我 VS 的 GAC 列表里找不到,所以才跑 C 盘 GAC 目录里面找。

10、编写测试代码,如下:

static void Main(string[] args)
{
string connectionString = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
using (OracleConnection conn = new OracleConnection(connectionString))
{
string sql = "select * from testorcl";
using (OracleCommand cmd = new OracleCommand(sql, conn))
{
conn.Open();
OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
string id = (reader.GetValue(0) ?? String.Empty).ToString();
string name = (reader.GetValue(1) ?? String.Empty).ToString();
Console.WriteLine(String.Format("ID={0}, Name={1}", id, name));
}
}
}
Console.ReadKey();
}

其中,连接字符串配置于App.config文件中,如下:

<connectionStrings>
<add name="connstr" connectionString="Data Source=127.0.0.1;User ID=suzy;Password=orcl;" providerName="Oracle.DataAccess.Client"/>
connectionStrings>

然后,将项目的目标平台设为x64,否则会运行失败。当然,如果你的机子是32位的就要选x86平台。

图 9

11、运行结果如下:

图 10

至此,使用 .NET 应用程序连接 Oracle 的一般步骤就是这样。当然,Oracle 也提供了支持 EntityFramework 的相关类库,感兴趣的同学可以去 Oracle 官网搜搜看。

参考文献
  • http://ora-12xyz.com/error/ORA-12504
  • http://gerardnico.com/wiki/database/oracle/listener.ora
  • http://blog.csdn.net/lpftobetheone/article/details/11099785
Tags: Oracle ODAC .NET