.net安装包自动安装Mysql数据库
在制作.Net安装包的时候,如果项目有用到数据库,怎么能够把数据库打包安装呢?网上已经有很多自动安装Sql Server数据库的例子,但是自动安装mysql的例子似乎不多。本文就介绍一下如何在.Net安装包中自动安装Mysql数据库。
最终我们要实现的效果是,部署.Net桌面应用程序时,能够一键自动安装应用程序以及附带的MySql数据库,并初始化数据库。
实现步骤如下:
1.准备一个干净的MySql安装包
mysql本身是开源的,安装完mysql数据库后,其实只是在系统里面安装了一个Windows服务(相对于Windows系统来说)
可以从网上下载一个mysql版本,比如我用的是Mysql5.5,下载地址:http://dev.mysql.com/downloads/mysql/5.5.html
下载安装包,按照正常安装流程安装完后,直接将安装后的目录拷贝一份为我们后面制作安装项目所用。
一般的mysql目录如:
2.修改My.ini配置文件
拷贝一份Mysql目录之后,需要根据项目的需要,需改一下mysql的设置,如设置缓存大小、存储类型等参数。
需要特别设置的是:
端口需要做特别设置,一般默认是3306端口,我们为了防止冲突,将端口改为3307
[mysqld]
# The TCP/IP Port the MySQL Server will listen on port=3307
basedir需要修改,此目录就是MySql文件夹的物理位置,这里显然需要动态配置,我们暂时用一个自定义的占位符来代替,后面在程序中修改。
#Path to installation directory. All paths are usually resolved relative to this.
basedir="%BaseDir%/MySQL Server 5.5/"
datadir需要修改,此目录是Mysql数据的存放路径,也需要动态配置,暂时用占位符代替,后面用程序修改。
#Path to the database root
datadir="%BaseDir%/MySQL Server 5.5/data/"
3.在安装项目中包含mysql文件
为了测试,我建了如下三个项目:
setup1项目就是.Net的安装项目
MySqlAutoInstall是模拟的一个需要使用mysql数据库的桌面程序。
InserterDb项目是一个DLL类库项目,功能是安装mysql数据库。我们将在setup1项目中调用此类库实现mysq数据库自动安装。
右键Setup1项目,选择“视图”--“文件系统”,将第一步准备的干净Mysql数据库文件夹拖入“应用程序文件夹”下。
再建一个“你的程序”文件夹(可自定义名称),下面放你的桌面程序,本例中是MySqlAutoInstall项目。
4.创建安装MySql数据库的自定义操作
建InserterDb的类库项目,添加一个“安装程序类”Installer1.cs
代码如下:
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq; using MySql.Data.MySqlClient;
using System.IO;
using System.Threading; namespace inserterDb
{
[RunInstaller(true)]
public partial class Installer1 : System.Configuration.Install.Installer
{
public Installer1()
{
InitializeComponent();
} public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver); InsertMySql();
CreatDataBase();
Log("安装成功!");
} //安装mysql
protected void InsertMySql()
{
string physicalRoot = this.Context.Parameters["targetdir"]; // 安装物理路径 C:\program\microp
string appPath = physicalRoot + "\\MySQL Server 5.5\\"; //1.修改my.ini配置 为防止本机已装mysql,特修改my.ini中端口号为3307
string iniFile = File.ReadAllText(appPath + "my.ini");
iniFile = iniFile.Replace("%BaseDir%", physicalRoot.Replace("\\", "/")); //%BaseDir%为my.ini中自定义的目录参数
File.WriteAllText(appPath + "my.ini", iniFile); Log("创建win服务……");
//2.创建win服务
string info1 = CommandHelper.Execute(appPath + "bin\\mysqld.exe", " install MySQL2 --defaults-file=\"" + appPath + "my.ini\"", 0);
Log(info1);
Thread.Sleep(3000);
Log("使用net start启动服务");
//3.启动服务
string info2 = CommandHelper.Execute("net start MySQL2", 0);
Log(info2); Log("启动服务完成!");
Thread.Sleep(5000);
MySqlConnection con = new MySqlConnection("Data Source='localhost';Port='3307';Database='';User Id='root';Password='';");
try
{
con.Open();
con.Close();
Log("连接成功!");
}
catch (Exception ex)
{
Log("连接失败!" + ex.Message);
}
}
//创建数据库并初始化表
protected void CreatDataBase()
{
string physicalRoot = this.Context.Parameters["targetdir"]; // 安装物理路径 C:\program\microp
string mysqlcon = "Data Source='localhost';Port='3307';Database='{0}';User Id='root';Password='';"; MySqlConnection conn = new MySqlConnection(string.Format(mysqlcon, ""));
FileInfo file = new FileInfo(physicalRoot + "\\DBInit\\yourDB.sql"); //filename是sql脚本文件路径。
string sql = file.OpenText().ReadToEnd(); try
{
MySqlScript script = new MySqlScript(conn);
script.Query = sql;
int count = script.Execute();
Log("数据库初始化完成!"); MySqlConnection con2 = new MySqlConnection(string.Format(mysqlcon, "yourDB"));
con2.Open();
MySqlCommand dbcom = new MySqlCommand("select count(*) from t_image", con2);
dbcom.ExecuteScalar();
con2.Close();
Log("数据库创建OK!"); //修改config.xml中的数据库链接地址 }
catch (Exception ex2)
{
Log("数据库创建失败!" + ex2.Message);
} } //写日志
protected void Log(string line)
{
string physicalRoot = this.Context.Parameters["targetdir"]; // 安装物理路径 C:\program\microp
string filePath = physicalRoot + "Install_log.txt";
if (File.Exists(filePath))
{
File.AppendAllLines(filePath, new string[] { DateTime.Now.ToString("[yyyy-MM-dd HH:mm:ss] ") + line });
}
else
{
File.WriteAllLines(filePath, new string[] { DateTime.Now.ToString("[yyyy-MM-dd HH:mm:ss] ") + line });
}
}
}
}
此类 override void Install方法,当程序安装完后,立即启动数据库的安装。
用代码安装MySql数据库安装步骤是:
1)修改my.ini配置 为防止本机已装mysql,特修改my.ini中端口号为3307
my.ini中的路径应该设置为安装程序的安装目录,这个目录是用户自定义的,可以通过设置Setup的customActionData属性来传递参数,详见后文介绍。
2)调用“mysqld.exe -install ”命令安装mysql数据库服务
3)使用net start启动Mysql服务
4)验证数据库安装结果
5)执行初始化脚本,初始化数据库
5.在Setup中关联安装MySql数据库的自定义操作
右键单击“setup1”项目,选择“视图”--“自定义操作” 在“安装”文件夹下右键选“添加自定义操作” 选择第4步制作的InserterDb的类库项目。
设置刚添加的自定义操作的属性,CustomActionData 为 /targetdir="[TARGETDIR]\"
这里的targetdir是自定义的参数名称,目的是获取用户选择的程序安装路径,用于修改Mysql配置文件中的%BaseDir%参数。
测试源码下载: Source
注意,由于mysql文件太大,该目录只留目录名,文件自己拷贝进去即可。
.net安装包自动安装Mysql数据库的更多相关文章
- 可以自动安装mysql数据库的一个shell脚本
发布:thatboy 来源:脚本学堂 [大 中 小] 分享一例shell脚本,可以实现mysql数据库的自动安装,脚本写的不错,无论是用来学习,还是生产环境中应用,都是不错的,有需要的朋友 ...
- Centos7下安装包方式安装MySQL
安装包下载地址:https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.27-1.el7.x86_64.rpm-bundle.tar 第一步:在 /h ...
- CentOS7安装mysql数据库
安装完Centos7,迫不急待的想安装mysql数据库,却没想到走了很多弯路,后来经过查资料,才知道了在Centos7中用MariaDB代替了mysql数据库. 准确来说,本文的标题有点误导的意思,本 ...
- Linux环境安装MySQL数据库
1. 下载mysql安装包 下载地址1: http://www.mysql.com/ (mysql官网) 下载地址2: http://mirrors.sohu.com/mysql/ (其 ...
- Linux系统上安装mysql数据库
一:下载并且上传安装包到linux系统上 1:下载地址:http://dev.mysql.com/downloads/mysql/ 2:通过LeapFtp工具,将windows上的mysql安装包拷贝 ...
- 离线安装mysql数据库
开源数据库mysql,目前使用很广泛.作为程序员开发项目时,与关系型数据库打交道最多的估计也是mysql了.那么本文首先讲解如何离线安装mysql数据库,毕竟有很多项目部署在内网. 1.离线安装 本人 ...
- linux下各安装包的安装方法
<转>linux下各安装包的安装方法 一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root ...
- Linux rpm包安装MySQL数据库问题总结
1.安装包准备 2.按顺序安装以下安装包 一定要按顺序安装,因为前面的包是后面包的依赖 [root@iz2ze1bzpi3orra8lboxqiz mysql]# rpm -ivh Percona-S ...
- Linux环境安装MySQL数据库(RPM格式的软件包)
1. 下载mysql安装包 下载地址1: http://www.mysql.com/ (mysql官网) 下载地址2: http://mirrors.sohu.com/mysql/ (其 ...
随机推荐
- Test SRM Level One: TemperatureScales
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=6038 因为TopCoder SRM比赛使用的编译器进行了升级, ...
- Tuxedo入门学�
中间件介绍: 介于客户机和server之间的夹层,突破了传统的c/s架构,为构建大规模,高性能,分布式c/s应用程序提供了通信,事物,安全,容错等基础服务,屏蔽了底层应用细节,应用程序不必从底层开发, ...
- Javascript设计模式系列三
继承,一个类或对象继承另一个类或对象的三种方法.类式继承.原型式继承.掺元类. 一.类式继承,原型链.Extend函数. <script type="text/javascript&q ...
- mysql回想一下基础知识
创建数据库 creat table test( #整数通常用于int test_id int, #十进制通常使用decimal test_price decimal, #普通文本通常使用.并使用Def ...
- projecteuler---->problem=14----Longest Collatz sequence
title: The following iterative sequence is defined for the set of positive integers: n n/2 (n is eve ...
- JDK5什么是新的线程锁技术(两)
一个. Lock线程同步实现互斥 Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也是一个对象. 两个线程运行的代码片段要实现同步相互排斥的效果.他们必须用 ...
- iOS_动态插入或删除行
终于效果图: 分MVC三层设计;自己定义的Cell有两种;一种是MainCell,由ModelArr提供数据源;还有一种是插入的cell,由代码创建,而且由另外一个数组供状态数据 数据源部分: wat ...
- NavigationBar隐藏
小编今天呢在搞 NavigationBar但是怎么弄都用不好,假设用navigationbar我往里面拖拽button.button的点击反应范围比較大,这样效果就不好. 突然看到有网友说能够将nav ...
- Android手机定位技术的发展
基于以下三种方式的移动位置:1. 网络位置 :2. 基站定位. 3. GPS定位 1 网络位置 前提是连接到网络:Wifi.3G.2G 到达IP址 比如:彩虹版QQ,珊瑚虫版QQ,就有一个功能显示对 ...
- ASP.NET 异步编程
ASP.NET 异步编程 相关博文: 异步编程 In .NET(回味无穷!!!) ASP.NET sync over async(异步中同步,什么鬼?) 本来这篇博文想探讨下异步中的异常操作,但自己在 ...