不知是不是受到微软影响,.net程序员似乎与生俱来与MS SQLSERVER密不可分,我所认识的.net开发者都用微软的MS。我也忘记了当时为何不加任何考虑的就投入了SQL SERVER的怀抱,陪伴着他从7.0直到现在的。当然这是微软所希望的,任何一个企业都希望顾客选择自己“一条龙”服务。但作为开发者我却不希望一直这样下去,特别是我们在实际工作中会接触到许多不同的系统,如果要对他们进行整合对接,擅长一家之言就稍显力不从心了。最近我就遇到了.net访问oracle的问题,虽然这个问题百度之后一堆解决方案,但真要吃透却是要真正消耗几个脑细胞的。闲话不说,下面简单讲述下事情经过。
公司最近发展很快,新上了很多项目,加之原先有我们自己的一套信息系统,因此,信息孤岛现象特别严重。因此,有必要对这些小孤岛慢慢进行整合统一,以达到资源共享,方便管理。作为客户,开发不是我们的强项。尤其以前比较封闭,很少接触ORACLE数据库,只是听说ORACLE和SQL SERVER从表结构到事物处理,甚至连SQL语法结构也有很大差别。但为了实现信息共享、消除信息孤岛这个“宏伟蓝图”,也只得克服困难,迎难而上了。
用访问ORACLE数据库有很多方式。微软提供了System.Data.OracleClient.dll组建,ORACLE提供了Oracle.DataAccess.Client组件。这两个DLL里面都提供了若干访问ORACLE数据库属性和方法。我的需求不是很复杂,只要能实现用从ORACLE里面读取表数据并简单显示出来就OK了。于是我做了个小测试,主要代码如下:
1 OracleConnectionoracleConn = new OracleConnection();
2 oracleConn.ConnectionString = " DataSource=127.0.0.1;PersistSecurityInfo=True;UserID=apts;Password=apts;Unicode=True " ;
3
4 string queryString = " SELECT*FROMaptsjn.tablename " ;
5 using (OracleConnectionconnection = new OracleConnection(oracleConn.ConnectionString))
6 {
7 OracleCommandcommand = new OracleCommand(queryString,connection);
8 connection.Open();
9 OracleDataReaderreader = command.ExecuteReader();
10 try
11 {
12 if (reader.Read())
13 {
14 Response.Write(reader[ 0 ].ToString());
15 }
16 }
17 finally
18 {
19 reader.Close();connection.Open();
20}
21}
代码写好了,这样就可以了吗?一测试,提示" ORA-12514: TNS: 监听进程不能解析在连接描述符中给出的 SERVICE_NAME". 郁闷了。.net里面访问数据库有web.config配置文件,那么访问ORACLE也应该有吧,百度一下,果然需要这个东东:tnsnames.ora。里面是这样的:
1 #TNSNAMES.ORANetworkConfigurationFile:C:\oracle\ora90\network\admin\tnsnames.ora
2 #GeneratedbyOracleconfigurationtools.
3
4 #sample
5
6 #DATABASENAME =
7 #(DESCRIPTION =
8 #(ADDRESS_LIST =
9 #(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2 )(PORT = 1521 ))
10 #)
11 #(CONNECT_DATA =
12 #(SERVICE_NAME = servicename)
13 #)
14 #)
15
16 #这里是我定义的
17 APTSLCNEW =
18 (DESCRIPTION =
19 (ADDRESS_LIST =
20 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168 . 1.2 )(PORT = 1521 ))
21 )
22 (CONNECT_DATA =
23 (SERVICE_NAME = apts)
24 )
25 )
26
27 ………… 好了,保存好之后,把上面的 Data Source=127.0.0.1改为Data Source=APTSLCNEW(名字随便起,前后对应就可以了),就这么简单。我试过了,在字符串里面写IP地址会引发错误,不知为何,日后慢慢研究吧。高手莫笑:)。
需要说明的是,访问ORACLE需要安装ORACLE客户端的,否则提示版本错误。客户端我安装的是ORACLE9i,服务器是ORACLE10g,tnsnames.ora文件在C:\Oracle\ora90\network\ADMIN里面。