クライアント側の環境、
Windows7,Excel2003~2010のVBA
Oracle10gもしくは11gもしくはInstantClient
ExcelのVBAからADO2.8のMicrosoft ODBC for OracleでOracleに接続しており、
Oracleサーバーが複数あります。
ユーザー環境のtnsnames.oraに接続文字列が無い場合、
VBAでエラーになるのでそれをキャッチして、
tnsnames.oraに接続文字列を書き加えようとしているのですが、
tnsnames.oraの場所がクライアントごとに違っていて、
取得方法に困っています。
環境変数'TNS_ADMIN'があればそれを取得するのですが、
無いクライアントもありました。
Cドライブをすべて検索していけば見つかるとは思うのですが、
それだと時間がかかってしまうし、
tnsnames.oraが複数あった場合、
Oracleが参照していないファイルを見つけることもあります。
なにか良い手は無いでしょうか?
よろしくおねがいします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
Windows Clientの場合はtnsnames.ora(=ORACLE_HOME)の場所を突き止めるのは容易ではないようです。
gusao様が教えてくださったHPの
NLS_LANG、ORACLE_HOME、ORACLE_SID などの設定を調べるには
"Windows におけるオラクル環境変数の確認方法"を見る限り、
ORACLE_HOMEはレジストリに書き込まれているので、そこから確認するのが確実かなと思います。
VBAで以下のようにプログラムを組めばできる気がします(VBAは詳しくありません…)
①"HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<任意>"でレジストリ検索
※ただし複数インストールされている場合はインストール数だけ見つかるのでループ処理?
②その下にある"ORACLE_HOME"からnetwork/admin/tnsnames.oraを特定して追記。
##一般的かわかりませんので、是非有識者のご意見を伺いたいところです…(;´Д`)##
ところでODBCドライバを使用して接続しているということは、
端末1台ずつODBCドライバを設定する手順が発生しているということですよね?
その手順の中にtnsnames.oraの追記とODBC接続テストを含めれば良いのではないでしょうか。
投稿2016/06/06 02:15
編集2016/06/06 02:23総合スコア81
0
ベストアンサー
WScript.Shellを利用して標準出力の結果を取得する
ORACLE_HOMEのレジストリ値取得であれば以下のようなコードでできると思います。
Sub Sample() Dim strPath As String strPath = GetOraHome("OraClient11g_home1") MsgBox strPath End Sub Function GetOraHome(ByVal vHOME_NAME As String) As String Dim WSH As Object Dim wExec As Object Dim sCmd As String Dim Result As String Dim strPath As String Set WSH = CreateObject("WScript.Shell") sCmd = "reg query ""HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_" & vHOME_NAME & """ /v ""ORACLE_HOME""" Set wExec = WSH.Exec("%ComSpec% /c " & sCmd) Do While wExec.Status = 0 DoEvents Loop Result = wExec.StdOut.ReadAll strPath = Trim(Mid(Result, InStr(Result, "REG_SZ") + 6, LenB(Result))) GetOraHome = strPath Set wExec = Nothing Set WSH = Nothing End Function
Oracle環境が複数インストールされているということでしたので、これとは別に対象環境の特定が必要だと思いますが、参考までに。
投稿2016/06/08 09:09
編集2016/06/09 00:34総合スコア3020
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
コマンドプロンプトでpathと入力してそれらしいのを探す。。。ってのじゃあまりに乱暴なので、
こんな方法はいかがでしょうか?
1.SQL*Plusでログインする
2.「@?」とコマンドを入力して実行する
この時に出力されるパスの.sqlを省いた部分がORACLE_HOMEにあたります。
実行例
SQL
1SQL>@? 2SP2-0310: ファイル"C:\app\client\product\12.1.0\client_1.sql"をオープンできません。
まぁ、ORACLE_HOME配下にフォルダ名と同一のsqlファイルがないことが条件にはなりますが。。。
とりあえず、ご参考までに。
投稿2016/06/06 06:03
総合スコア94
0
TNS_ADMIN
が設定されていない場合は、$ORACLE_HOME/network/admin
を参照するようです。
投稿2016/06/06 00:03
総合スコア185
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/06 01:53

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/06 02:46
2016/06/06 03:38