2010-01-05 7 views
7

द्वारा फ़ाइल tnsnames.ora का स्थान प्राप्त करना Oracle क्लाइंट के साथ एक मशीन में कोड द्वारा tnsnames.ora फ़ाइल का स्थान कैसे प्राप्त किया जा सकता है?कोड

क्या कोई फ़ाइल रजिस्ट्री कुंजी है जो इस फ़ाइल का स्थान इंगित करती है?

+0

आप महसूस करें कि 'प्रोग्रामेटिक' का अर्थ है 'कोड द्वारा, है ना? –

+0

@ जॉर्ज मैं एक समाधान की तलाश में हूं, जरूरी नहीं कि विंडोज रजिस्ट्री पर आधारित है, क्योंकि उस सवाल को फिर से संपादित करें। – RRUZ

उत्तर

10

कुछ साल पहले मुझे एक ही समस्या थी।
फिर मुझे ओरेकल 9 और 10 का समर्थन करना पड़ा, इसलिए कोड केवल उन संस्करणों का ख्याल रखता है, लेकिन शायद यह आपको कुछ शोध से बचाता है। विचार करने के लिए है:

  • रजिस्ट्री खोज ओरेकल क्लाइंट संस्करण ORACLE_HOME खोजने के लिए
  • कोशिश निर्धारित करने के लिए
  • अंत में घर से tnsnames मिल

public enum OracleVersion 
{ 
    Oracle9, 
    Oracle10, 
    Oracle0 
}; 

private OracleVersion GetOracleVersion() 
{ 
    RegistryKey rgkLM = Registry.LocalMachine; 
    RegistryKey rgkAllHome = rgkLM.OpenSubKey(@"SOFTWARE\ORACLE\ALL_HOMES"); 

    /* 
    * 10g Installationen don't have an ALL_HOMES key 
    * Try to find HOME at SOFTWARE\ORACLE\ 
    * 10g homes start with KEY_ 
    */ 
    string[] okeys = rgkLM.OpenSubKey(@"SOFTWARE\ORACLE").GetSubKeyNames(); 
    foreach (string okey in okeys) 
    { 
     if (okey.StartsWith("KEY_")) 
      return OracleVersion.Oracle10; 
    } 

    if (rgkAllHome != null) 
    { 
     string strLastHome = ""; 
     object objLastHome = rgkAllHome.GetValue("LAST_HOME"); 
     strLastHome = objLastHome.ToString(); 
     RegistryKey rgkActualHome = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\ORACLE\HOME" + strLastHome); 
     string strOraHome = ""; 
     object objOraHome = rgkActualHome.GetValue("ORACLE_HOME"); 
     string strOracleHome = strOraHome = objOraHome.ToString(); 
     return OracleVersion.Oracle9; 
    } 
    return OracleVersion.Oracle0; 
} 

private string GetOracleHome() 
{ 
    RegistryKey rgkLM = Registry.LocalMachine; 
    RegistryKey rgkAllHome = rgkLM.OpenSubKey(@"SOFTWARE\ORACLE\ALL_HOMES"); 
    OracleVersion ov = this.GetOracleVersion(); 

    switch(ov) 
    { 
     case OracleVersion.Oracle10: 
      { 
       string[] okeys = rgkLM.OpenSubKey(@"SOFTWARE\ORACLE").GetSubKeyNames(); 
       foreach (string okey in okeys) 
       { 
        if (okey.StartsWith("KEY_")) 
        { 
         return rgkLM.OpenSubKey(@"SOFTWARE\ORACLE\" + okey).GetValue("ORACLE_HOME") as string; 
        } 
       } 
       throw new Exception("No Oracle Home found"); 
      } 
     case OracleVersion.Oracle9: 
      { 
       string strLastHome = ""; 
       object objLastHome = rgkAllHome.GetValue("LAST_HOME"); 
       strLastHome = objLastHome.ToString(); 
       RegistryKey rgkActualHome = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\ORACLE\HOME" + strLastHome); 
       string strOraHome = ""; 
       object objOraHome = rgkActualHome.GetValue("ORACLE_HOME"); 
       string strOracleHome = strOraHome = objOraHome.ToString(); 
       return strOraHome; 
      } 
     default: 
      { 
       throw new Exception("No supported Oracle Installation found"); 
      } 
    } 
} 

public string GetTNSNAMESORAFilePath() 
{ 
    string strOracleHome = GetOracleHome(); 
    if (strOracleHome != "") 
    { 
     string strTNSNAMESORAFilePath = strOracleHome + @"\NETWORK\ADMIN\TNSNAMES.ORA"; 
     if (File.Exists(strTNSNAMESORAFilePath)) 
     { 
      return strTNSNAMESORAFilePath; 
     } 
     else 
     { 
      strTNSNAMESORAFilePath = strOracleHome + @"\NET80\ADMIN\TNSNAMES.ORA"; 
      if (File.Exists(strTNSNAMESORAFilePath)) 
      { 
       return strTNSNAMESORAFilePath; 
      } 
      else 
      { 
       throw new SystemException("Could not find tnsnames.ora"); 
      } 
     } 
    } 
    else 
    { 
     throw new SystemException("Could not determine ORAHOME"); 
    } 
} 
+0

+1 शुरू करने के लिए एक उचित स्थान की तरह दिखता है। बेशक, गैर-मानक प्रतिष्ठानों के लिए खानपान और विभिन्न समाधान विकल्पों के साथ-साथ तत्काल ग्राहक जैसी चीजें शायद आपको ग्रे हेयर देगी। –

+0

हालांकि GetOracleHome() में रजिस्ट्री से पहले आपको पर्यावरण चर का प्रयास करना चाहिए और उपयोग करना चाहिए। –

+0

शुक्र है कि अब मुझे ओरेकल के साथ कैच-अप खेलना नहीं है क्योंकि कोई और अब इस कोड को बनाए रख रहा है :) लेकिन रजिस्ट्री से पूछताछ करने से पहले पर्यावरण की जांच करना अच्छा लगता है। –

0

नेट के मुताबिक ओरेकल के संस्करण और एसक्यूएल * प्लस प्रक्रिया की कार्यशील निर्देशिका पर निर्भर करता है। This first link आपको पर्यावरण चर बताता है जो ओरेकल के कुछ संस्करणों (7, 8, 9आई) के लिए मूल पथ निर्दिष्ट करता है। यदि आप एक अलग का उपयोग करते हैं, तो मुझे यकीन है कि सिस्टम निर्देशिका में आने का एक ही तरीका है।

यदि आप इन फ़ाइलों के संस्करणों को पूरे स्थान पर फैलाते हैं और क्लाइंट के "स्थानीय tnsnames.ora पहले" व्यवहार पर भरोसा करते हैं, तो मुझे लगता है कि आप भाग्य से बाहर हैं।

+0

वह लिंक कुछ हद तक पुराना है, लेकिन व्यवहार लगभग नवीनतम संस्करण (11 जी) के समान ही है। –

7

विंडोज़ पर, सबसे अधिक संभावना स्थान %ORACLE_HOME%/network/admin या %TNS_ADMIN% (या TNS_ADMIN रजिस्ट्री सेटिंग) हैं। ये दो कवर लगभग हर स्थापना।

बेशक इस फ़ाइल के बिना ओरेकल क्लाइंट काम करना संभव है। ओरेकल नेटवर्किंग विकल्पों की असरदार श्रृंखला है, और TNSNAMES का उपयोग करने के साथ एक कार्य सेटअप प्राप्त करने के कई तरीके हैं। आप जो हासिल करने की कोशिश कर रहे हैं उसके आधार पर, आपका पहला पोर्ट कॉल sqlnet.ora फ़ाइल हो सकता है, जो %ORACLE_HOME%/network/admin में भी पाया जाता है।

NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, HOSTNAME) 

TNSNAMES मतलब है कि यह TNSNAMES.ora फ़ाइल (दूसरा इस मामले में) का उपयोग करेगा: यह एक लाइन है कि कुछ इस तरह दिखता शामिल करना चाहिए। LDAP और HOSTNAME डेटाबेस को हल करने के वैकल्पिक तरीके हैं। यदि कोई TNSNAMESTNSNAMES.ora फ़ाइल को सही जगह पर मौजूद होने पर अनदेखा कर दिया जाएगा।

सी # में/नेट यह आप वातावरण चर मिलना चाहिए:

Environment.GetEnvironmentVariable("ORACLE_HOME");

Environment.GetEnvironmentVariable("TNS_ADMIN");

+0

@ कोलिन, दुर्भाग्य से ये चर हमेशा ऑरैक क्लाइंट द्वारा सेट नहीं होते हैं। मैं ओरेकल 11 जी का उपयोग कर रहा हूँ। – RRUZ

+0

क्या आप तत्काल ग्राहक या नियमित ग्राहक का उपयोग कर रहे हैं? –

+0

मेरा मानना ​​है कि तत्काल क्लाइंट डिफ़ॉल्ट रूप से% ORACLE_HOME% या tnsnames.ora नहीं बनाता है –

0

मैं नहीं कर रहा हूँ एक C# या उस बात के लिए एक Windows पुरुष इसलिए उम्मीद है कि इस मदद करता है। tnsnames.ora फ़ाइल में स्थित होना चाहिए:

ORACLE_HOME\network\admin 

एक वैकल्पिक स्थान निर्दिष्ट किया गया है, तो यह TNS_ADMIN रजिस्ट्री कुंजी के माध्यम से उपलब्ध होना चाहिए।

ओरेकल विंडोज़ पर टीएनएस नामों को कैसे प्रबंधित करता है, इस बारे में अधिक जानकारी के लिए यह link देखें।

2
List<string> logicalDrives = Directory.GetLogicalDrives().ToList(); 
      List<string> result = new List<string>(); 
      foreach (string drive in logicalDrives) 
      { 
       Console.WriteLine("Searching " + drive); 
       DriveInfo di = new DriveInfo(drive); 
       if(di.IsReady) 
        result = Directory.GetFiles(drive, "tnsnames.ora", SearchOption.AllDirectories).ToList(); 
       if (0 < result.Count) return; 
      } 
      foreach (string file in result) { Console.WriteLine(result); } 
+3

यह सूचियां * tnsnames.ora की हर * प्रति। यह नहीं दिखाता कि कौन सा उपयोग में है। –

+1

आपने यह निर्दिष्ट नहीं किया है ... – GxG

+0

मेरा प्रश्न नहीं है, लेकिन आप सही हैं, यह स्पष्ट नहीं है। अभ्यास में, यह निर्धारित करना कि कौन सा tnsnames.ora उपयोग में है, सामान्य रूप से महत्वपूर्ण है, लेकिन मैंने सोचा कि आपका उत्तर अभी भी एक उपयोगी योगदान था, जिसमें मैंने जो चेतावनी दी थी, इसलिए मैंने आपको प्राप्त डाउनवॉट का मुकाबला करने के लिए एक उपरोक्त दिया है। –