سؤال

كيف يمكنني الحصول على موقع tnsnames.ora ملف حسب الرمز، في جهاز باستخدام عميل Oracle مثبت؟

هل يوجد مفتاح تسجيل Windows يشير إلى موقع هذا الملف؟

هل كانت مفيدة؟

المحلول

منذ بضع سنوات كان لدي نفس المشكلة.
في ذلك الوقت، اضطررت إلى دعم Oracle 9 و 10 لذا يعتني الكود إلا تلك الإصدارات فقط، ولكن ربما ينقذك من بعض الأبحاث. الفكرة هي:

  • ابحث في التسجيل لتحديد إصدار عميل Oracle
  • محاولة للعثور على 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");
    }
}

نصائح أخرى

على ويندوز، فإن المواقع الأكثر احتمالا هي إما %ORACLE_HOME%/network/admin أو %TNS_ADMIN% (أو إعداد التسجيل TNS_ADMIN). هذان الغطاء تقريبا كل التثبيت.

بالطبع، من الممكن الحصول على عميل Oracle يعمل بدون هذا الملف. لدى Oracle مجموعة من خيارات الشبكات، وهناك الكثير من الطرق لتحقيق إعداد عمل باستخدام استخدام TNSNames. اعتمادا على ما تحاول تحقيقه هنا، قد يكون ميناء الاتصال الأول الخاص بك هو sqlnet.ora ملف، والذي وجد أيضا في %ORACLE_HOME%/network/admin. وبعد يجب أن يحتوي هذا على خط يبدو مثل هذا:

NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, HOSTNAME)

TNSNAMES يعني أنها سوف تستخدم TNSNAMES.ora ملف (الثاني في هذه الحالة). LDAP و HOSTNAME طرق بديلة لحل قاعدة البيانات. إذا لم يكن هناك TNSNAMES ال TNSNAMES.ora سيتم تجاهل الملف إذا كان موجودا في المكان المناسب.

في C # / .NET، يجب أن تحصل على متغيرات البيئة:

Environment.GetEnvironmentVariable("ORACLE_HOME");

Environment.GetEnvironmentVariable("TNS_ADMIN");

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); }

وفقا للشبكة التي تعتمد على إصدار Oracle ودليل العمل لعملية SQL * Plus. هذا الرابط الأول يخبرك بمتغير البيئة الذي يحدد المسار الأساسي لبعض الإصدارات (7، 8، 9i) من Oracle. إذا كنت تستخدم واحدة مختلفة، فأنا متأكد من أن هناك طريقة مماثلة للوصول إلى دليل النظام.

إذا قمت بنشر إصدارات هذه الملفات في جميع أنحاء المكان على الرغم من أن "البحث عن سلوك TNSNames.ora أولا" للعميل، فما أعتقد أنك بعيد المنال.

أنا لست جي # أو نظام Windows لهذه المسألة لذلك نأمل أن يساعد ذلك. يجب أن يكون ملف tnsnames.ora في:

ORACLE_HOME\network\admin

إذا تم تحديد موقع بديل، فينبغي أن يكون متاحا عبر مفتاح التسجيل TNS_ADMIN.

انظر الى هذا حلقة الوصل لمزيد من المعلومات حول كيفية مقابض Oracle أسماء TNS على Windows.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top