在net安装程序中部署oracle客户端全攻略
主要的是要做三件工作: 打包文件,写注册表,注册环境变量
说明:我的oracle版本为9, 在2000 advanced server 上测试通过,可以正常创建数据库连接
1.打包文件
目录结果如下图所示

以下是我的打包程序中的文件目录,
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客户端设置
在net安装程序中部署oracle客户端全攻略的更多相关文章
- webBrowser中操作网页元素全攻略
原文 webBrowser中操作网页元素全攻略 1.获取非input控件的值: webBrowser1.Document.All["控件ID"].InnerText; 或webBr ...
- 大型ECShop安装搬家升级错误问题最全攻略
[引子] 最近将ECShop框架网站从租用服务器搬家至阿里云,虽然模块及功能上已经被修改的面目全非了,但基础部分还在. 在这个过程中遇到了很多的WARNING与ERROR,解决方案如下. [环境] 服 ...
- [转]MSI安装程序中的文件替换
原文链接:http://teach.hanzify.org/article/652-1233562028.html 前言 最近有汉化朋友问起如何不重新制作MSI文件,而直接用汉化好的文件替换MSI安装 ...
- Android-x86虚拟机安装配置全攻略
转自Android-x86虚拟机安装配置全攻略 注:这里安装从简,具体请参考虚拟机Vmware安装运行安卓4.0详细教程 Android-x86虚拟机安装配置网上有很多,但是全部说明白的确不多,希望这 ...
- Linux一键安装web环境全攻略phpstudy版
此教程主要是应对阿里云Linux云服务器ecs的web环境安装,理论上不限于阿里云服务器,此教程对所有Linux云服务器都具有参考价值. 写这篇文章的目的:网上有很多关于Linux一键安装web环境全 ...
- VS2013全攻略(安装,技巧,快捷键,插件)!
工欲善其事,必先利其器.VS2013全攻略(安装,技巧,快捷键,插件)! 之前一篇<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥>承蒙大家喜爱和编辑推荐,在此 ...
- 从小工到专家 ——读《Java程序员职场全攻略》有感
从小工到专家 ——读<Java程序员职场全攻略>有感 <Java程序员职场全攻略>是以故事的形式,向读者介绍Java程序员的职场经验.作者牛开复在北京从事软件开发,已经是一 ...
- TestLink安装全攻略
TestLink安装全攻略 此文章转自该链接--http://www.cnblogs.com/Tcorner/archive/2011/07/26/2117296.html 安装前准备 需要下载xam ...
- 微信小程序——【百景游戏小攻略】
微信小程序--[百景游戏小攻略] 本次课程小项目中的图片以及文章还未获得授权!请勿商用!未经授权,请勿转载! 博客班级 https://edu.cnblogs.com/campus/zjcsxy/SE ...
随机推荐
- requirejs实践二 加载其它JavaScript与运行
上一篇中介绍了requirejs加载JavaScript文件,在这一篇中介绍加载JavaScript后执行代码 这次是test2.html文件, <!DOCTYPE html> <h ...
- javaScripte 创建对象。。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- Codevs 1066 引水入城 2010年NOIP全国联赛提高组
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 在一个遥远的国度 ...
- 九度OJ 1085 求root(N, k) -- 二分求幂及快速幂取模
题目地址:http://ac.jobdu.com/problem.php?pid=1085 题目描述: N<k时,root(N,k) = N,否则,root(N,k) = root(N',k). ...
- top工具
top 显示进程所占系统资源 能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top命令打印出了很多信息,包括系统负载(loadaverage).进程数(Tasks).c ...
- PHP正则表达式 验证电子邮件地址
我们最经常遇到的验证,就是电子邮件地址验证.网站上常见.各种网页脚本也都常用“正则表达式”(regular expression)对我们输入的电子邮件地址进行验证,判断是否合法.有的还能分解出用户名和 ...
- php练习7——类的运用(四则运算or面积计算[javascript小技巧——根据需求显示不同界面])
要求:请编写一个类,该类可以进行四则运算,也可以进行矩形面积计算 1.程序 viewCount.html Count.class.php printCount.php 2.结果 ...
- 常见排序算法(PHP实现)
function InsertSort($arr){ $num = count($arr); for($i = 1; $i < $num; $i++){ $key = $arr[$i]; for ...
- php图片上传代码
使用copy函数 if (!empty($_FILES)) { //图片 if(isset($_FILES['image'])) { $img_data = $_FILES['image']['tmp ...
- C语言和C++中动态申请内存
在C语言和C++的动态内存的使用方法是不同的,在C语言中要使用动态内存要包含一个头文件即 #include<malloc.h> 或者是#include<stdlib.h> ...