標簽:style blog http color 使用 os
原文:.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文件太大,該目錄只留目錄名,文件自己拷貝進去即可。
.net安裝包自動安裝Mysql數據庫,码迷,mamicode.com
標簽:style blog http color 使用 os
原文地址:http://www.cnblogs.com/lonelyxmas/p/3698755.html