一些 ASP.NET + Oracle 11g 系統邊寫邊學的隨筆,包括引用 Oracle 官方的 Data Provider、更改 Oracle 儲存的日期格式。
(八) 引用 Oracle 官方的 Data Provider
在上一篇文章「Oracle 11g 學習筆記 (3)」的最後,有提供一個 ASP.NET 2.0 的樣本給大家下載。但該帖最後有提到,若您執行樣本的作業系統中,並未安裝 Oracle 11g 的 server-side 程式 (例如 Oracle 安裝在別台主機),則當您用 Visual Studio 執行本樣本時,可能會出現下列的錯誤訊息:
“OraOLEDB.Oracle.1”未在本機電腦註冊
OraOLEDB.Oracle' 提供者並未登入於本機電腦上
The OraOLEDB.Oracle provider is not registered on the local machine
解決方式,是去 Oracle 官方網站,下載 Data Provider 和 Oracle 的 client-side 程式並安裝,下載網址如下:
http://www.oracle.com/technology/software/tech/windows/odpnet/index.html (較新)
http://www.oracle.com/technology/software/tech/dotnet/utilsoft.html (較舊)
安裝完後,即能以 Visual Studio 執行本樣本。但您若改用 IIS 執行樣本時,仍可能會出現上述的錯誤資訊,因為若您用的是 Windows 作業系統,必須在 NTFS 分區上,再設定一些讓 IIS / ASP.NET 的使用者,有寫入 IIS 所在主機的 Oracle 主程式目錄的許可權。會出現這種錯誤,是因為 Oracle 和 IIS 安裝在不同的主機上。
(1)
以版工而言,我用的是 Windows Server 2003 作業系統,我是將下列兩個目錄,開放檔案夾的許可權,讓「ASP.NET 使用者」、「IIS_WPG 群組」、「NETWORK SERVICE 群組」有寫入和修改的許可權 (是設定 IIS 或 Visual Studio 所在的主機,而非 Oracle server-side 程式所在的主機):
C:\app
C:\Program Files\Oracle
再於 Windows 中執行「gpupdate /force」迫使設定馬上生效 (若仍不行就重開機)。
(2)
網路上並有幾篇文章,提到還要做一些設定:
http://365.blog.ccidnet.com/blog.php?do=showone&itemid=687411&typ=blog
http://topic.csdn.net/t/20050428/09/3972494.html
http://topic.csdn.net/t/20040510/17/3050699.html
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20050513132850F5H&fumcde=FUM20041006161839LRJ&rplcnt=16
例如對 Oracle server-side 程式所在的主機,對 sqlnet.ora 這個檔案,做以下的設定:
SQLNET.AUTHENTICATION_SERVICES=(NTS)
改成
SQLNET.AUTHENTICATION_SERVICES=(NONE)
以版工而言,sqlnet.ora 是位在下列目錄:
C:\app\Administrator\product\11.1.0\db_1\NETWORK\ADMIN
(3)
網路上還提到,若仍出現先前提到的錯誤,就再對 Oracle client-side 程式所在的主機 (即 IIS 所在的主機),做以下的 Registry 註冊動作:
regsvr32 ..\ORACLE_HOME\bin\OraOLEDB11.dll
但版工我並不用做到這個動作,IIS 即可用 ASP.NET 應用程式,聯機到另一台主機上的 Oracle 11g。
另須注意,若您用的是 Oracle 提供的 OleDb Data Provider,當透過 Visual Studio 2005 的圖形設定介面,設定資料庫聯機後,SQL 陳述式中的資料表名稱前後,會被自動加上「中括弧 [ ] 」,如下:
SELECT * FROM [t04]
當您一執行時,這組「中括弧」卻會引發下列的錯誤:
ORA-00903: 表格名稱無效
解決之道,是手動把「中括弧」拿掉即可。若您用的是 OracleClient Data Provider,則不會有此問題。但若透過 Visual Studio 2005 的圖形介面,設定 OracleClient 資料庫聯機後,仍會在資料表的名稱前後,自動加上「雙引號 " "」,如下:
SELECT * FROM "T04"
------------------------------------------------------------------------------------------
(九) 更改 Oracle 的日期格式
Oracle 在中文的作業系統中安裝好後,在 Date 類型中,預設的日期格式為「03-3月-03」。此時透過 ASP.NET 應用程式,雖仍能正常「讀、寫」Oracle 的 Date 類型,但若要 透過 SQL Plus 寫入資料庫,就必須在「月份」的數字後面,再加上一個中文字「月」,才能正確寫入資料庫。
若您在 SQL Plus 中輸入下列指令:
select * from nls_session_parameters;
會看到
NLS_DATE_FORMAT 參數,其值為:DD-MON-RR
NLS_LANGUAGE 參數,其值為:TRADITIONAL CHINESE (以繁體中文 Windows 作業系統為例)
有些情況,我們可能希望更改 Oracle 中儲存的日期格式,若在 Windows 作業系統下,我們就必須去修改「註冊表 (Registry)」。若您用的是其它作業系統,亦可參考下列這幾 篇文章:
http://space.itpub.net/658698/viewspace-265000
http://topic.csdn.net/t/20030320/16/1555747.html
http://tech.techweb.com.cn/archiver/tid-228974.html
以 Windows Server 2003 作業系統,以及 Oracle 11g 為例,我們要先在 Oracle server-side 程式所在主機的 Windows 中,輸入「regedit」指令進入 Registry,接著進入到 :
HKEY_LOCAL_MACHINE → SOFTWARE → ORACLE → KEY_OraDb11g_home1
(1) 修改既有的 NLS_LANGUAGE 參數,將儲存月份的格式,從中文「月」改成英文:
進入 Registry 上述的目錄後,將既有的 NLS_LANGUAGE 參數,從原本的「TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950」,改成「American_America.ZHT16MSWIN950」即可;簡體中文的作業系統亦同,把前半段的字串,改成「American_America」即可。
(2) 新增一個 NLS_DATE_FORMAT 參數,將儲存格式依我們的需求修改:
進入 Registry 上述的目錄後,建立一個「字串值」,命名為「NLS_DATE_FORMAT」,並設定其值為:
YYYY-MM-DD:HH24:MI:SS
如此即成功地修改了 Oracle 的預設時間格式。此時若您再於 SQL Plus 輸入指令:
select * from nls_session_parameters;
會看到
NLS_DATE_FORMAT 參數,其值已經變為:YYYY-MM-DD:HH24:MI:SS
上述兩種修改,不論修改與否,都仍可用 ASP.NET 等應用程式,正常以「2008/1/3」或「2008/01/03 12:30:30」這類的格式去寫入 Oracle 資料庫。
但應注意,若您在 Oracle server-side 內建的,或從 Oracle 網站獨立下載的「Oracle SQL Developer」這套圖形介面工具,若在裡面輸入「select * from
nls_session_parameters;」這項指令,所看到的語系資訊,並不是真正在 Oracle 11g server-side 的設定,而是「Oracle SQL Developer」工具其本身自己的語系設定。
在 Oracle 中,不管是透過 SQL Plus,還是 Oracle SQL Developer 這套工具,只要是對資料做 INSERT、UPDATE,都要再下一個 Commit; 或 Rollback; 的指令。之前版工我發現透過 Oracle SQL Developer 寫入資料庫的記錄,透過 SQL Plus 或 ASP.NET 一直讀不出來,原本以為是兩者的日期格式、語系各自獨立,且設定不同的原因, 事實上並不是,而是要在寫入資料庫後,再下一次「Commit;」指令,才算真正完成寫入的動作。
此外,在網路上流傳的另一項指令:
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
只能暫時性地修改語系設定。因此若要修改語系,最好還是修改 Oracle server-side 程式所安裝主機的 Registry,才是永久性的解決方案。