ExcelのVBAでOracleのtnsnames.oraのある場所を知るには
解決済
回答 4
投稿
- 評価
- クリップ 1
- VIEW 11K+
クライアント側の環境、
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が参照していないファイルを見つけることもあります。
なにか良い手は無いでしょうか?
よろしくおねがいします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
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接続テストを含めれば良いのではないでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
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環境が複数インストールされているということでしたので、これとは別に対象環境の特定が必要だと思いますが、参考までに。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
TNS_ADMIN
が設定されていない場合は、$ORACLE_HOME/network/admin
を参照するようです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
コマンドプロンプトでpathと入力してそれらしいのを探す。。。ってのじゃあまりに乱暴なので、
こんな方法はいかがでしょうか?
1.SQL*Plusでログインする
2.「@?」とコマンドを入力して実行する
この時に出力されるパスの.sqlを省いた部分がORACLE_HOMEにあたります。
実行例
SQL>@?
SP2-0310: ファイル"C:\app\client\product\12.1.0\client_1.sql"をオープンできません。
まぁ、ORACLE_HOME配下にフォルダ名と同一のsqlファイルがないことが条件にはなりますが。。。
とりあえず、ご参考までに。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/06/06 11:46
ODBCドライバは設定不要です。
Microsoft ODBC for Oracleは基本的にインストールされているので、
ADOならコントロールパネルに設定なしでも接続が可能なのです。
2016/06/06 12:38