.net 调用Oracle 的一些总结。
原来一直用SQLServer,最近开始用Oracle了。转型当中遇到了很多问题,随着遇到的问题越来越多,我会把自己的心得不断地补充,以备不时之需。
一、一上来遇到的就是.net 调用Oracle 存储过程、函数困难,关于这方面的常见问题,请参照这位兄弟的博客:
http://cwbboy.cnblogs.com/archive/2006/03/22/356017.html
二、在使用Oracle的过程中发现,Oracle的对于SQL语句的检查要比SQLServer严格的多,比如:
1、在Oracle和SQLServer中,虽然建表的时候不允许有重复的字段名,但是在查询语句中如果使用了重复别名,情况就不一样了,比如:
SELECT A.* FROM (
SELECT ID,code as 代码,cn_name as 中文名称,code as 代码,cn_name as 中文名称 FROM BS_PERSON
) A
在SQLServer中执行成功,而在Oracle中执行则会提示错误:ORA-00918: column ambiguously defined,意思是列没有明确定义。为什么Oracle中会这样呢?原来,在嵌套查询中,外层查询会根据子查询的查询结果生成临时表A,又因为在表中是不允许有重复字段的,Oracle对于这点检查十分严格,SQLServer只对实际的物理表进行检查。所以会有此差异。
三、Oracle10g安装过程中"无法确定主机的IP地址时产生该异常错误" 的解决办法:
1、原来Oracle10g以后版本在安装前会先检测系统的IP地址,而如果通过DHCP动态获取IP地址的机器,在解析IP地址时Oracle会认为是不确定的IP地址,就会出现上述异常。经修改c:\windows\system32\drivers\etc\hosts文件来手动解析后安装成功,文件内容如下:
127.0.0.1 localhost
动态获取的IP地址 计算机机器名
2、单机版上安装Oracle的解决办法:
到控制面板/添加硬件,在向导中选择“是,已经连接了此硬件”→“网络适配器”→“Microsoft Loopback Adapter”,添加完成,你会发现新建了个假的“本地连接”,为得是骗下Oracle。把这个本地连接的IP设置一下(例如192.168.1.1)。这时,再回去重新让Oracle检测一遍,通过!。
四、ORA-12514:TNS无法识别当前请求的服务名
网上的解决办法:修改Listener.ora文件,例如:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = G:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = G:\oracle\product\10.2.0\db_1)
(SID_NAME = ORCL)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 机器的IP地址)(PORT = 1521))
)
)
黑体字部分为要在Listener.ora文件中添加的部分,红色为需要注意修改的部分。
然后再重起Oracle服务和监听服务,注意先后顺序。
这是通常情况的下的解决办法,但我的情况很特殊。由于我的服务器是通过DHCP动态获取IP,服务器IP变了后,通过上述方式修改,鼓捣半天也不行,令我百思不得其解。后来重装了Oracle,遇到了问题三,从而辗转发现原来是Oracle无法自动识别动态IP在作祟。虽然费了一番大周折,但总算问题解决了。
当然可能还有很多其他的原因。就我来讲遇到的情况是这样的。。。。。。
以上未完待续,前后顺序很乱,随学随记,最后在整理顺序……