C#連接ORACLE出現亂碼問題的解決方法
以前做過java項目,連接各種數據庫都得心應手,最近接觸c#的一個項目,連接SqlServer數據庫倒也是很好用,但是遇到oracle數據庫就萎瞭,於是搜索好多資料,有使用oracle.datamanager.dataaccess的,有System.Data.OracleClient.OracleConnection的,也有System.Data.OleDb.OdbcConnection連接的,但前兩種方式都試瞭,依舊如此亂碼,於是就試試最後一種:
方法一
連接字符串:
“Provider=oraoledb.oracle;Data Source=(DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.10.10)(PORT = 1521)))(CONNECT_DATA = (SID = orcl))) ;User Id=user;Password=user”
報錯:未註冊數據提供程序!
於是繼續搜索,網上說需要安裝oracle相關連接組件,這就很麻煩瞭,不可能所有機子都安裝這個組件
於是繼續找解決方法,最後發現以下連接是可以的,也就是在使用System.Data.OracleClient.OracleConnection時候,不再提示註冊程序之類的, 問題終於解決瞭,查詢結果也不亂碼!
連接字符串:
“Provider=MSDAORA.1;Data Source=(DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =
10.20.10.10
)(PORT = 1521)))(CONNECT_DATA = (SID = orcl))) ;User Id=lswen;Password=1169″
註意:Provider=MSDAORA.1; 而不是Provider=oraoledb.oracle;
方法二
1.打開註冊表:開始-運行-regedit
HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_OraDb11g_home1/OLEDB
在右側點鼠標右鍵–新建–字符串值–名稱改為:NLS_LANG 值設為:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
2.我的電腦-屬性-高級系統設置-環境變量-在系統變量下方點擊新建–變量名:NLS_LANG 變量值: SIMPLIFIED CHINESE_CHINA.ZHS16GBK
方法三
make1828同學給出的解決方法
1:先查詢oralce的字符編碼:select userenv(‘language’) from dual;
2:在環境變量中設置NLS_LANG變量:
3:配置連接字符串:
Provider=OraOLEDB.Oracle;User ID=***;Password=***;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = ***)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ORCL)))
4:安裝Oracle客戶端:(可自行網上搜索下載)
5:需要的可用下載一個PLSQL工具
可以到WalkonNet下載即可 https://www.jb51.net/softs/664139.html
方法四
最近我用程序讀取oracle數據庫中數據時發現中文全部是亂碼。於是我展開瞭一系列的辦法最終解決瞭此問題。
工作環境:服務器 windows 2003+ oracle。
服務器字符集 SIMPLIFIED CHINESE_CHINA.WE8DEC。
編程環境 VS2005,C#,PLSQL。
方案一:
利用System.Data.OracleClient.OracleConnection類訪問數據庫。
連接字符串:
“Data Source= (DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.0.5)(PORT = 1521)))(CONNECT_DATA = (SID = DEV))) ;User Id=lswen;Password=1169”
將本地字符集改為與服務器相同。
打開註冊表regdit:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEO 中NLS_LANG改為: SIMPLIFIED CHINESE_CHINA.WE8DEC。
這個方法簡直就像噩夢,根本解決不瞭,網上有很多人發表用這種方法。答案是片面的,如果服務器的字符集是: ZHS16GBK那麼此法就可以解決。字符集WE8DEC是西歐字符集本身包含的漢字就不多,之所以它允許用存入漢字是因為它將一個漢字拆分為兩個字節存儲方式,其他中文字符集的客戶端無法直接還原為一個中文。所以必須保持客戶端與服務器一致—–這網上看到的不知道自己的理解是否對。
方案一 失敗。
方案二 :
利用System.Data.OleDb.OdbcConnection類訪問數據庫。
連接字符串:
“Provider=MSDAORA.1;Data Source=(DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.0.5)(PORT = 1521)))(CONNECT_DATA = (SID = DEV))) ;User Id=lswen;Password=1169”
將本地字符集改為與服務器相同,方法同方案一相同。
這一下問題終於解決瞭。
強調連接字符串因該使用Provider=MSDAORA.1; 不能使用Provider=oraoledb.oracle;
方案二 成功瞭。
總結 :
不管是WE8DEC,還是其他一些西歐字符集都存在這樣的問題,用第二種方案應該都可以解決。
推薦閱讀:
- PLSQL連接本地oracle或遠程oracle數據庫實現隨意切換功能
- IntelliJ DataGrip Oracle 11g遠程連接的方法步驟
- oracle連接ODBC sqlserver數據源的詳細步驟
- 教你使用PLSQLDeveloper14連接Oracle11g的詳細過程
- 使用Docker制作Python環境連接Oracle鏡像