zoukankan      html  css  js  c++  java
  • .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:programmicrop
                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:programmicrop
                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:programmicrop
                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文件太大,该目录只留目录名,文件自己拷贝进去即可。

  • 相关阅读:
    【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组
    【BZOJ4010】[HNOI2015]菜肴制作 拓扑排序
    【BZOJ4028】[HEOI2015]公约数数列 分块
    有道云笔记配合MPic+七牛云 自制MarkDown文档图床(适用Typora)
    Python面试题之Python反射机制
    Python爬虫学习笔记之爬虫基础库
    Django学习笔记之Django Form表单详解
    Django学习笔记之Django的url反向解析
    SQL学习笔记之SQL中INNER、LEFT、RIGHT JOIN的区别和用法详解
    SQL学习笔记之MySQL中真假“utf8” 问题
  • 原文地址:https://www.cnblogs.com/tuyile006/p/3693151.html
Copyright © 2011-2022 走看看