請問 Delphi 連 Oracle 最佳連接方式 |
答題得分者是:rick060
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
|
rick060
高階會員 發表:2 回覆:112 積分:217 註冊:2009-11-17 發送簡訊給我 |
不論何種方式連接 Oracle , 一定要安裝 Oracle Client
所以用法有 2 1.安裝 Oracle Client ,一樣用 ado 連接,速度上坦白說很一般 2.也一定要安裝 Oracle Client ,使用 OCI (http://www.oracle.com/technetwork/database/features/oci/index.html)連接,coding 時間長,但連接速度超快 不論何種方式,都要注意 Oracle client 與 server NLS_LANG 的問題。 |
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
補充一下,需求是,把 Oracle 或 Sql Server 其中一方的文件內容,複製到另一方,每次只複製一份文件,所以,資料量不會很大,一份文件由十幾個資料表組成,表頭、項次、項次的明細,總共三層,從 Sql Server 複製到 Oracle 時,TAdoDataSet 可以知道 RecordCount,但從 Oracle 複製到 Sql Server 時,不曉得有沒有 RecordCount ?我根據來源的 RecordCount 來判斷要不要打開目標資料表來寫入,沒有資料當然不用打開目標資料表。
考慮用 DBExpress,但從來沒用過,很久以前就知道 DBExpress 是 unidirectional,會不會沒有 RecordCount ?Sql Server 複製到 Oracle 那邊會不會有問題? |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
如果有錢的話
就買「ODAC」吧,速度最快,而且不需安裝ORACLE CLIENT 沒錢的話,不想改變現有習慣就勉強用ADO吧,反正資料量也不大,就當過渡吧 至於RecordCount,你是要從sql server 到 oracle吧,這樣來源端仍然可以用ADO,目的端不需知道count也沒關係 DBX的RecordCount有一些限制,詳情請見這兒 我記得BOF = EOF也可以判斷有無資料 另外,只有Enterprise以上版本的DBX才有ORACLE Driver ===================引 用 cancer 文 章=================== 補充一下,需求是,把 Oracle 或 Sql Server 其中一方的文件內容,複製到另一方,每次只複製一份文件,所以,資料量不會很大,一份文件由十幾個資料表組成,表頭、項次、項次的明細,總共三層,從 Sql Server 複製到 Oracle 時,TAdoDataSet 可以知道 RecordCount,但從 Oracle 複製到 Sql Server 時,不曉得有沒有 RecordCount ?我根據來源的 RecordCount 來判斷要不要打開目標資料表來寫入,沒有資料當然不用打開目標資料表。 考慮用 DBExpress,但從來沒用過,很久以前就知道 DBExpress 是 unidirectional,會不會沒有 RecordCount ?Sql Server 複製到 Oracle 那邊會不會有問題? |
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
謝謝兩位的解答,如果 ADO 能搞定的話,用 ADO 就好,DBExpress 那種 unidirectional 方式,我有點不放心,RecordCount 可能會誤判,就連 TAdoDataSet 必須設為 clUseClient,否則 RecordCount 會不正確。
Oracle client 好像退休囉 http://blog.darkthread.net/post-2010-05-14-bye-ado-net-oracleclient.aspx 新上任,instant Client http://topic.csdn.net/t/20060118/09/4522650.html 真的好麻煩,都要加環境變數、登錄檔,可能 ADO 是 Windows 內建,所以 ADO 才甚麼都不用設。 網路上查到的,都是零零散散的內容,請問哪裡有 Ado 或 DBX 連 Oracle 的完整步驟教學?
編輯記錄
cancer 重新編輯於 2011-06-09 01:37:34, 註解 無‧
|
rick060
高階會員 發表:2 回覆:112 積分:217 註冊:2009-11-17 發送簡訊給我 |
http://www.oracle.com/technetwork/database/express-edition/downloads/102xewinsoft-090667.html
如tnsnames.ora 裡面配合 server 設定-> TNSNAME/IP/Port 再利用 ado 的 connectionstring 就能連線了。 ado連線記憶中流程-> 1.在桌面建一個空檔 1.udl 2.點兩下 3.提供者選 oracle oledb 4.連線 中填入連線名稱(對照tnsnames.ora 裡的tnsname) 5.填入帳號密碼測試 透過此檔以文字編輯器開啟即可得知 connectionstring 以上流程在delphi 裡tadoconnection 做也行。 |
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
RIck大,感謝,想請問一下,
tnsnames.ora 裡面配合 server 設定-> TNSNAME/IP/Port 是要把主機的 IP 寫死在tnsnames.ora 檔裡面嗎? 能不能要連線時才決定 IP? 因為我手頭上的程式,裝在三個不同的工作地點,各自也有自己的資料庫,登入時選取主機,決定要進入哪一台主機,等於是三套完全相同的系統,Oracle 只裝在總公司,Oracle 的 IP 會因為登入不同主機而有所不同,總公司員工在公司內部登入總公司主機,會使用內部 IP,以提高效率,兩家分公司連上 Oracle 用 ADSL,是外部 IP,所以需要連線時才決定主機 IP |
rick060
高階會員 發表:2 回覆:112 積分:217 註冊:2009-11-17 發送簡訊給我 |
oracle 無法直接由 ado 變動連線主機,一定要透過 tnsname.ora ,但一次可以設定多組。
以 oracle client 10g express client 為例, 裝完後不會自動產生tnsname.ora 可自行建立 (目錄路徑為 ORACLE HOME/network/admin/ ) C:\XEClient\network\admin\tnsnames.ora 內容為 Oracle1= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = ORA1) ) ) Oracle2= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = ORA2) ) ) Oracle3= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.3)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = ORA3) ) )
一次設定三台,然後在 AP 動態選擇要連線的主機名如何? (可以選擇的是oracle1 / oracle2 / oracle3,不 service name) 參考: http://www.orafaq.com/wiki/Tnsnames.ora |
senso
高階會員 發表:5 回覆:126 積分:226 註冊:2003-11-27 發送簡訊給我 |
tnsname.ora是像組態的東西,所以可以不用tnsname.ora喔
只是就變成要打那長長的一串.... ex: Provider=MSDAORA.1;Password=xxx;User ID=xxx;Data Source="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.xxx.xxx)(PORT=xxx)))(CONNECT_DATA=(SERVICE_NAME=xxx)))";Persist Security Info=True |
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
HI 各位,剛才去了
http://www.oracle.com/technetwork/database/express-edition/downloads/102xewinsoft-090667.html 最有可能的下載連結是 Oracle Database 10g Express Client OracleXEClient.exe (30,943,220 bytes) Client software to be installed on client systems for remotely accessing Oracle Database 10g Express Edition. You do not need to install the client onto the same computer as Oracle Database 10g Express Edition. 下載回來的檔案沒有副檔名,按雙兩下後,Windows 不知道要用甚麼程式來打開,下載錯了嗎? 上面寫 for Express Edition,用來連正式版的 Oracle 不知道會不會有問題? Oracle 的 Download 網頁一進去,就看到一大堆下載連結,搞不太懂到底要按那一個連結,有下載過的朋友,能不能告訴我到底是按哪一個連結? |
rick060
高階會員 發表:2 回覆:112 積分:217 註冊:2009-11-17 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
嘩,居然有這種安裝檔,連副檔名都沒有。加上 .exe 後果然可以執行,安裝好之後,到安裝路徑 C:\XEClient 看了一下,並沒鵲 network 資料夾,要自己新增 network\admin 資料夾嗎?
Rick 大,上面寫是結 Express 版使用的,用來連上正式版,該不會有問題吧? 我自己的電腦裝好,程式寫好,Oracle Client 要裝在很多使用者的電腦裡,怕 Express 會有問題。 ===================引 用 rick060 文 章=================== ?下載下來是少了副檔名沒錯.. 要自己把 .exe 加回去...
編輯記錄
cancer 重新編輯於 2011-06-09 23:57:20, 註解 無‧
|
rick060
高階會員 發表:2 回覆:112 積分:217 註冊:2009-11-17 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
Rick 大,我來建 tnsnames.ora 看看,但安裝程式沒有幫我產生 network\admin,是有點怪怪的。
===================引 用 rick060 文 章=================== 連線要用到的是它自己本身 OCI.dll ?的 call. 做與 server 間的訊息溝通。 理論上不分版本才對,若會擔心,可以下載標準版來安裝,裡面也有 client 的元件, 但我想 oci.dll 是一樣的。 我過去的做法是用 oracle 9i client ?的 oci call 來連 9/10 ,是沒問題的。 tnsname.ora 若沒有可以自己建哦,我上一篇有回覆。 |
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
SELECT * FROM SYS.V_$DATABASE;
其中的 NAME 即為 SERVICE NAME. 若是 Oracle XE, 則一律 = "XE". 但該 VIEW 無法查到 SID. for Oracle 8i, 在 Windows Server 之 d:\oracle\[SERVICE_NAME]\pfile\init.ora 檔有 Database 啟動的完整參數資訊 db_name = "[DATABASE NAME]" instance_name = [SID] service_names = [SERVICE NAME] for Oracle XE, 在 Windows Sercer 之 d:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\init.ora 檔有 Database 啟動的完整參數資訊 db_name=XE |
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
摸出來了,可以連得到,謝謝各位大大幫忙,就以最先回應的 rick060 大為最佳得分者好了。
一直連不上,原來 rick大提供的內容被網站防衛機制改為 forbidden,一時沒注意改回來 Oracle1= (DEforbiddenION = <------ 原先覺得名稱怪怪,原來是 DESCRIPTION 才對 (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = ORA1) ) )
安裝好 Oracle Client 之後,不會自動建立 network\admin 資料夾,只好自己加進去,手工新增空白的 tnsnames.org,現有使用者是透過遠端連線的方式來使用,所以主機有 tnsnames,把它的內容複製到我自己的 Oracle Client,再新增一份 .udl 檔,選 tnsnames 的連線名稱,輸入帳號、密碼,可以連得上資料庫。 再按照 senso 大提供的方式試一下,不用 tnsnames.ora,直接把 tnsnames.ora 的連線內容插入 TAdoConnection.ConnectionString 裡面,真的可以連線,真的方便多了,原本的 tnsnames.ora 還是留著供參考。 |
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |