zoukankan      html  css  js  c++  java
  • 在.net安装程序中部署oracle客户端全攻略

    主要的是要做三件工作: 打包文件,写注册表,注册环境变量
    说明:我的oracle版本为9, 在2000 advanced server 上测试通过,可以正常创建数据库连接


    1.打包文件
    目录结果如下图所示

    oralce客户端

    以下是我的打包程序中的文件目录,
    bin : 最重要的当然是bin目录,在我的打包程序中,需要29个文件:

      --------------------
    oci.dll
    oraclient9.dll
    oracommon9.dll
    ORACORE9.DLL
    orageneric9.dll
    oraldapclnt9.dll
    oran9.dll
    ORANCDS9.DLL
    orancrypt9.dll
    oranhost9.dll
    oranl9.dll
    oranldap9.dll
    ORANLS9.DLL
    oranms.dll
    oranmsp.dll
    orannts9.dll
    orannzsbb9.dll
    oranoname9.dll
    oranro9.dll
    orantcp9.dll
    orantns9.dll
    ORAPLS9.DLL
    ORASLAX9.DLL
    ORASNLS9.DLL
    ORASQL9.DLL
    oratrace9.dll
    ORAUNLS9.DLL
    oravsn9.dll
    orawtc9.dll
    --------------------

    network/admin : tnsnames.ora
          tnsnames.ora文件内容如下:(SERVICE_NAME = 服务器的连接)
       ORCL =
          (DESCRIPTION =
            (ADDRESS_LIST =
              (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521))
            )
            (CONNECT_DATA =
              (SERVICE_NAME = orcl)
            )
          )

    ocommon/nls/ADMIN/DATA: 原oracle安装目录下所有文件
    oracore/zoneinfo : timezone.dat

    2.写注册表
    HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE
    "ORACLE_HOME" = "c:/oracle/ora90"
    我发现从网上查到的 HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0下的ORACLE_HOME值并不是必须的.

    3.注册环境变量
    HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Control/Session Manager/Environment
    "path" += "D:/oracle/ora90/bin;"

    这里需要注意的是最好不用把path直接设成这个值,这样会覆盖掉系统原有的path,所以最好是在原有的path上添加.但是.net安装程序中通过直接设置注册表无法做到,这时候可以通过添加自定义安装操作来在程序中完成.

    一个问题是在设置path后不会立即生效,所以安装完程序后,系统找不到oracle的bin目录,无法建立数据库连接. 我现在的做法是把bin目录下的29个文件都拷贝到系统的[System目录](在.net的部署程序中,文件系统->特殊文件夹).有点恶毒阿,不过临时凑活着吧 :) 谁找到解决的办法记得告诉我阿

    示例代码如下:

        
    #region 检查Oracle客户端设置
            /// 
            /// 检查Oracle客户端设置
            /// 
            private void CheckOracleClient() {
                string[] keys = { "SYSTEM", "ControlSet001", "Control", "Session Manager", "Environment" };
                this.SetRegistryKey(Registry.LocalMachine, keys, "Path", @"c:/oracle/ora90/bin", true);
                keys = new string[] { "Software", "ORACLE"};
                this.SetRegistryKey(Registry.LocalMachine, keys, "ORACLE_HOME", @"C:/oracle/ora90", false);
            }
    
            /// 
            /// 将指定的值写入注册表
            /// 
            /// <param name="startKey">初始的注册表项</param>
            /// <param name="registryKeys">注册表项数组,表示了指定值的路径</param>
            /// <param name="valueName">值的名称</param>
            /// <param name="value">要写入的值</param>
            /// <param name="append">是否在当前值前添加,若为否,则覆盖当前值</param>
            private void SetRegistryKey(RegistryKey startKey, string[] registryKeys, string valueName, string value, bool append) {
                
                RegistryKey rk = startKey;
                RegistryKey subKey = null;
                for (int i=0; i<registryKeys.GetLength(0); i++) {
                    subKey = rk.OpenSubKey(registryKeys[i], true);
                    if (subKey == null) {
                        subKey = rk.CreateSubKey(registryKeys[i]);
                    }
                    rk = subKey;
                } 
               
                if (append) {
                    if (rk.GetValue(valueName) == null) {
                        rk.SetValue(valueName, value);
                    } else {
                        string oldValue = rk.GetValue(valueName).ToString();
                        if (oldValue.IndexOf(value) > 0) {
                            rk.SetValue(valueName, value + ";" + oldValue);
                        }
                    }
                } else {
                    if (rk.GetValue(valueName) == null) {
                        rk.SetValue(valueName, value);
                        rk.Flush();
                    }
                }
                if (subKey != null) {
                    subKey.Close();
                }
                rk.Flush();
                rk.Close();
            }
            #endregion 检查Oracle客户端设置   
    
  • 相关阅读:
    小程序-自定义组件
    51Nod
    CodeForces
    JSON、闭包和原型----透视Javascript语言核心
    转载:动态规划法总结
    to初学者:从汉诺塔问题深入理解递归算法思想
    不知‘时间复杂度’所云的看过来
    盲点流水账记录
    常用序列化协议总结
    排序——了解总体以及插入排序
  • 原文地址:https://www.cnblogs.com/superch0054/p/4010231.html
Copyright © 2011-2022 走看看