.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
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | 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文件太大,该目录只留目录名,文件自己拷贝进去即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异