eaglet

本博专注于基于微软技术的搜索相关技术
随笔 - 189, 文章 - 0, 评论 - 3725, 阅读 - 147万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

.net 程序远程连接 Oracle 数据库

Posted on   eaglet  阅读(11185)  评论(7编辑  收藏  举报

.net 远程连接Oracle数据库看起来挺简单的,但实际做起来还是遇到不少问题。把我今天折腾这个东西的经验给大家共享吧。

访问 oracle 数据库的方式很多,我给出两种,一种是OleDbConnection 还有一种是 .NET Managed Provider for Oracle,这个没什么好说的,代码如下:

1. 连接代码

采用 OleDbConnection 连接的方法如下:
_OleDbConnection = new OleDbConnection(connectionString);
_OleDbConnection.Open();
 
采用 OracleConnection 连接的方法如下:
 
_OracleConnection = new OracleConnection(connectionString);
_OracleConnection.Open();
 
这里需要注意的是 OleDbConnection 对 Clob 之类的 Oracle 9i 的数据类型不支持,必须使用 OracleConnection
参见 INFO: Limitations of Microsoft Oracle ODBC Driver and OLEDB Provider
如果用 OracleConnection 必须安装 .NET Managed Provider for Oracle
下载地址
.NET Managed Provider for Oracle
 

2.连接字符串

远程连接的连接字符串可以这样写

OleDbConnection 的连接字符串:

provider=MSDAORA;host=192.168.1.1;data source=MyTest;user id=system;password=xxx

provider = MSDAORA; 指明oledb 的提供者是oracle数据库

host 是远程 oracle 数据库所在服务器的IP地址,如果端口不是默认的 1521,还要加上一个 Port=xxxx;

data source 是要访问的 oracle 数据库的名字

user id 和 password 就不说了。

 

.NET Managed Provider for Oracle 的连接字符串:

server=192.168.1.1;data source=MyTest;user id=system;password=xxx

 

要能够成功运行上面代码,我们必须在代码运行的机器上安装 oracle 的客户端,否则会报

The Oracle(tm) client and networking components were not found 这个错误。

 

3. 主机防火墙设置

我的 Oracle 安装在 windows 2003 server 上,为了安全起见,必须设置防火墙

我在 windows 2003 下将 1521 端口开放,发现无法连接数据库,抓包看了一下,oracle 客户端在连接了 1521 后又去连接了一个随机的端口 1197

查了一下资料,oracle 的 network listener 只起一个中介作用,当客户连接它时,它根据配置寻找到相应的数据库实例进程,然后分配一个新的数据库连接,这个连接端口由network listener传递给客户机,此后客户机就不再和network listener打交道了,而是和 oracle.exe 这个进程打交道了。这个新的连接端口是不可预知的,因而会被防火墙阻止。

要解决这个问题,网上查到的办法是采用共享套接字,这个方法应该是一个比较通用的办法,如何做详见

在windows server 2003系统防火墙上开放Oracle服务端口 连接1521 TNS超时 

不过我偷了个懒,因为我只用 windows 的防火墙,windows 防火墙可以对某个进程开放所有端口。所以只要按下面图示的方式设置一下windows 防火墙,就可以访问了。

 

image

 

image

 

 

4. 客户端和服务器的字符集

插入中文时显示乱码,需要将客户端和服务器的NLS_LANG 都设置为

SIMPLIFIED CHINESE_CHINA.ZHS16GBK

Windows 下

修改注册表

    HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0 下的NLS_LANG (9i)
    HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_OraDb10g_home1 下的NLS_LANG (10g)

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2008-03-31 一个C#写的调用外部进程类
点击右上角即可分享
微信分享提示