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文件太大,该目录只留目录名,文件自己拷贝进去即可。

  • 相关阅读:
    Entity Framework Core 2.0 新特性
    asp.net core部署时自定义监听端口,提高部署的灵活性
    asp.net core使用jexus部署在linux无法正确 获取远程ip的解决办法
    使用xshell连接服务器,数字键盘无法使用解决办法
    使用Jexus 5.8.2在Centos下部署运行Asp.net core
    【DevOps】DevOps成功的八大炫酷工具
    【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别
    【Network】UDP 大包怎么发? MTU怎么设置?
    【Network】高性能 UDP 应该怎么做?
    【Network】golang 容器项目 flannel/UDP相关资料
  • 原文地址:https://www.cnblogs.com/tuyile006/p/3693151.html
Copyright © 2011-2022 走看看