.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 防火牆,就可以訪問了。
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)