全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:13725
推到 Plurk!
推到 Facebook!

請問 Delphi 連 Oracle 最佳連接方式

答題得分者是:rick060
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-06-09 10:31:10 IP:220.128.xxx.xxx 未訂閱
各位好,公司需要寫一支程式,把資料從 Oracle 和 Sql Server 2005 之間做交換,Sql Server 這邊沒問題,一直都用 Ado 連接,Oracle 我從來沒摸過,在 K-top 搜尋欄輸入 Oracle,出現一大堆跟 Oracle 連接完全不相干的主題,包括徵人廣告,到網路上查了一下,也是各式各樣的連接方式,希望能找到最佳的連接方式,最佳是指,最少的安裝設定,最快的執行速度,請各位提供一下意見,謝囉。
rick060
高階會員


發表:2
回覆:112
積分:217
註冊:2009-11-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-06-09 11:35:15 IP:60.250.xxx.xxx 未訂閱
 不論何種方式連接 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-06-09 11:41:41 IP:220.128.xxx.xxx 未訂閱
補充一下,需求是,把 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-06-09 13:31:39 IP:59.120.xxx.xxx 未訂閱
如果有錢的話
就買「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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-06-09 15:25:48 IP:220.128.xxx.xxx 未訂閱
謝謝兩位的解答,如果 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-06-09 16:50:25 IP:60.250.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-06-09 19:22:15 IP:220.128.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-06-10 08:25:37 IP:60.250.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-06-10 09:46:05 IP:61.219.xxx.xxx 訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-06-10 12:01:51 IP:220.128.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-06-10 12:54:15 IP:60.250.xxx.xxx 未訂閱
 下載下來是少了副檔名沒錯..
要自己把 .exe 加回去...
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2011-06-10 13:38:07 IP:220.128.xxx.xxx 未訂閱
嘩,居然有這種安裝檔,連副檔名都沒有。加上 .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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2011-06-10 14:01:44 IP:60.250.xxx.xxx 未訂閱
連線要用到的是它自己本身 OCI.dll  的 call. 做與 server 間的訊息溝通。
理論上不分版本才對,若會擔心,可以下載標準版來安裝,裡面也有 client 的元件,
但我想 oci.dll 是一樣的。


我過去的做法是用 oracle 9i client 的 oci call 來連 9/10 ,是沒問題的。

tnsname.ora 若沒有可以自己建哦,我上一篇有回覆。
編輯記錄
rick060 重新編輯於 2011-06-10 00:03:03, 註解 無‧
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#14 引用回覆 回覆 發表時間:2011-06-10 15:21:20 IP:220.128.xxx.xxx 未訂閱
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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2011-06-10 20:31:11 IP:220.128.xxx.xxx 未訂閱
各位好,怎麼設都連不上,原來要知道主機的 SID 或 Service name,用 Service Name 似乎較好,到主機用 PL Sql 不知道怎麼查得到 Service name?
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#16 引用回覆 回覆 發表時間:2011-06-10 23:34:50 IP:202.39.xxx.xxx 訂閱
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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2011-06-13 09:08:13 IP:220.128.xxx.xxx 未訂閱
herbert2 大,是 Oracle 9,用 select 可以嗎?用 select 會比較好,任何能用的 Oracle 介面都能用,又不用管資料夾是哪一個。
編輯記錄
cancer 重新編輯於 2011-06-12 19:11:55, 註解 無‧
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#18 引用回覆 回覆 發表時間:2011-06-13 09:42:53 IP:202.39.xxx.xxx 訂閱
各版 SYS.V_$DATABASE 內容稍異,但都有 NAME。
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#19 引用回覆 回覆 發表時間:2011-06-13 09:45:52 IP:220.128.xxx.xxx 未訂閱
herbert2 大,謝了,select 指令有查到 service name,我再繼續摸索下去。
===================引 用 herbert2 文 章===================
各版 SYS.V_$DATABASE 內容稍異,但都有 NAME。
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#20 引用回覆 回覆 發表時間:2011-06-13 10:49:24 IP:220.128.xxx.xxx 未訂閱
摸出來了,可以連得到,謝謝各位大大幫忙,就以最先回應的 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

發送簡訊給我
#21 引用回覆 回覆 發表時間:2011-06-13 10:51:00 IP:220.128.xxx.xxx 未訂閱
上個月看還是中階會員,今天看卻變成高階會員,謝謝各位給分大大。
系統時間:2024-04-20 2:39:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!