Top / TIPS / TNSNAMES.ORA

TNSNAMES.ora は

1.カレントディレクトリ
2.環境変数 TNS_ADMIN で定義されたパス
3.$ORACLE_HOME\network\admin

の順に検索されます。

ちょっと困るのが、$ORACLE_HOME です。
Windows の場合、環境変数に設定されておらず、レジストリから読み取ることになりますが、複数の ORACLE_HOME が同居できたりするので結構面倒。(^_^;)

というわけで、OCI.DLL の位置を探して、そこから相対パスを求めると楽チンですね。

ORACLE_HOME
      +--- bin 
            +---OCI.DLL
      +--- network
            +---admin
                 +---tnsnames.ora

OCI.DLL の位置を探すには、SearchPath という API を使うと良いです。

というわけでサンプル(^_^;)

Private Declare Function SearchPath Lib "kernel32" _
                                Alias "SearchPathW" _
                               (ByVal lpPath As Long, _
                                ByVal lpFileName As Long, _
                                ByVal lpExtension As Long, _
                                ByVal nBufferLength As Long, _
                                ByVal lpbuffer As Long, _
                                ByRef lpFilePart As Long) As Long

Public Function GetNetworkAdminFolder() As String
   Dim nSize       As Long
   Dim strBuffer   As String
   Dim nFilePart   As Long
   Const cOCI      As String = "OCI.DLL" & vbNullChar
   
   strBuffer = Trim(Environ("TNS_ADMIN"))
   If strBuffer <> "" Then
       GetNetworkAdminFolder = strBuffer
       Exit Function
   End If
   
   nSize = SearchPath(0, StrPtr(cOCI), 0, 0, 0, nFilePart)
   strBuffer = String(nSize, vbNullChar)
   nSize = SearchPath(0, StrPtr(cOCI), 0, Len(strBuffer), StrPtr(strBuffer), nFilePart)
   strBuffer = Left(strBuffer, InStr(strBuffer, vbNullChar) - 1)
   GetNetworkAdminFolder = BuildPath(strBuffer, "..\..\network\admin\")

End Function

Private Function BuildPath(ByVal SourcePath As String, ByVal RelPath As String) As String
   Dim v       As Variant
   Dim i       As Long
   Dim vPath   As Variant
   Dim strPath As String
   Const cYen  As String = "\"

   If Left$(RelPath, 3) Like "?:\" Or Left$(RelPath, 2) = "\\" Then
       ' 絶対パス
       strPath = RelPath
   Else
       ' 相対パス
       If Right$(SourcePath, 1) <> cYen Then
           SourcePath = SourcePath & cYen
       End If
       If Left$(RelPath, 1) = cYen Then
           RelPath = Mid$(RelPath, 2)
       End If
       strPath = SourcePath & RelPath
   End If

   vPath = Split("")
   For Each v In Split(strPath, cYen)
       If v = ".." Then
           If UBound(vPath) > 0 Then
               ReDim Preserve vPath(UBound(vPath) - 1)
           End If
       ElseIf v = "." Then
       Else
           ReDim Preserve vPath(UBound(vPath) + 1)
           vPath(UBound(vPath)) = v
       End If
   Next

   strPath = Join(vPath, cYen)

   If strPath = "" Then
       BuildPath = cYen
   Else
       BuildPath = strPath
   End If

End Function



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2009-11-03 (火) 00:33:50 (2912d)