C#.net连oracle的问题
此文记述了C#.net连接Oracle数据库的方法。
.net编程通常我们都使用SqlServer数据库,但有的时候必须要用.net+Oracle的怪异组合,也是可以的,微软和甲骨文分别提供了各自的支持库。在此文中将分别讲述两种不同的方法。
此外,文中还提供了让程序脱离Oracle客户端的方法,在要发布给客户的windows窗体应用程序中比较实用。
要使用这种方法,首先,要在解决方案中添加引用"System.Data.OracleClient",注意:如果你的解决方案目标框架选择为".NET Framework 4 Client Proflie",那么将无法添加该引用,因为在此目标框架中,已经不再提供OracleClient支持了。并且,微软已经推荐不要使用这个引用,因为在今后的.NET Framework中都将不再支持OracleClient。
闲话少说,还是看看这个怎么用吧。添加了引用以后,就可以引用namespace:using System.Data.OracleClient;
之后使用如下代码使用
oracle.cs
//设置数据库连接OracleConnection conn = new OracleConnection("Data Source=[数据源];User Id=[用户名];Password=[密码];");string strSQL="[要执行的SQL语句]";OracleCommand myComm=new OracleCommand(strSQL,conn); try{ conn.Open(); //创建OracleDataReader 对象来连接到表单 OracleDataReader myRead = myComm.ExecuteReader(); //业务代码 //关闭reader对象 myRead.Close(); //关闭连接 conn.Close();}
上面的数据源就是在本机oracle数据库中配置好的oracle连接的名称。可以使用oracle连接管理器配置,也可以直接编辑oracle客户端的tnsnames.ora文件。比如下面这样的:
TESTLINK = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 128.1.2.42)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) )
这个例子中,TESTLINK就是数据源名称。
要使用这种方式,你需要去甲骨文主页下载ODAC for .net。当然,鉴于甲骨文网站必须要注册才能下载,而且下载的速度堪称龟速,你也可以直接在电驴等P2P网络上搜索ODTwithODAC1110720.zip来找到下载。总共有211MB。
下载完成后解压安装,之后就可以在你的解决方案中添加引用using Oracle.DataAccess.Client;
具体使用方法和前面大同小异。如下:
oracle.cs
string connstring = "Data Source=[数据源];User Id=[用户名];Password=[密码];";using (OracleConnection conn = new OracleConnection(connstring)){ conn.Open(); string strSQL = "[SQL语句]"; using (OracleCommand comm = new OracleCommand(strSQL, conn)) { using (OracleDataReader rdr = comm.ExecuteReader()) { //结果集没有数据的时候直接返回 if (!rdr.HasRows) { MessageBox.Show("该数据库是空的"); return; } //循环遍历结果集 while (rdr.Read()) { //业务代码 } //关闭reader对象 rdr.Close(); } } //关闭连接 conn.Close();}
虽然这种方法没有了失去后续支持的后顾之忧,但我们肯定会觉得麻烦,因为除了oracle客户端,还要装一个ODAC。这么一想,其实第一种方法也挺麻烦,因为也离不开Oracle客户端的支持。我们总是要先用Oracle客户端配置好数据库连接才能使用我们的程序,如果部署的机器很多,这实在是个繁琐的事。
我们可以观察一下,这个数据源到底干了什么。他指定了真正的URL,端口号,数据库名之类信息,除此之外也没有什么了。那么是不是我们在连接字串内告诉客户端这些信息就可以不用配置数据源了呢?事实上也确实是这样的...将上面例子中的连接字串改成如下形式
oracle.cs
"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=[真正的URL])(PORT=[端口号]))" + "(CONNECT_DATA=(SID=[数据库名])));User Id=[用户名];Password=[密码];";
再次编译执行程序,发现连接正常!现在比之前两个例子舒服多了。这不但减少了配置数据源的工作量。而且这样一来,我们可以额外提供,根据界面输入的数据库地址来连接某个临时的数据库等功能。
但别急,问题还是存在。如果这个程序是一个要发布到客户的电脑上运行的客户端软件,难道让客户也没台电脑去装一个Oracle客户端?这显然不是什么好主意...
让我们回忆下JAVA是怎么连Oracle的,一个ojdbc14.jar解决了所有问题,什么讨厌的Oracle客户端之类的与我无关。那么既然JAVA可以,没道理.net就不行。这个200多MB的庞大的ODAC内到底有多少类是直接用来连接数据库的?为什么JDBC驱动就这么一点点,而.net驱动却要这么大?
事实上,确实是不需要那么多东西的,真正被用到的几个动态链接库,加起来也就那么几MB。
下面来看看怎么做吧。首先,解压ODTwithODAC1110720.zip,别急着安装,继续解压。现在得到了一大堆jar包。选中所有jar包,全部解压了.....
现在你得到了无数的dll动态连接库文件。现在在其中搜索以下文件名的动态连接库文件:
oci.dlloraociicus11.dllorannzsbb11.dllOracle.DataAccess.dllOraOps11.dll
将这些文件拷贝到你编译好的可执行文件所在目录,然后打包发布吧。随便找一台没有oracle客户端的电脑试试吧!
有时候,程序发布后出问题了,数据库连不上了,你想确定一下到底是数据库连接的问题,还是你的程序有问题。但是客户的机器上又没有装Oracle客户端,怎么办呢?虽然你也可以随身邮盘带个40MB的即时客户端过去,但总归麻烦。
这里提供一个简便的方法。
在刚才解压出来的一大堆东西里面,还有一个
orasqlplusic11.dll
将这个文件,以及从Oracle客户端里拷贝出来的
sqlplus.exe
一起放到你的可执行文件所在目录里去。现在你就可以在没有安装Oracle客户端的客户机上使用命令行的SQL*Plus来测试你的数据库了。