/* 说明:本安装方法,是以实际工作为例,测试通过!
*/
一).创建部署项目
1. 在“文件”菜单上指向“添加项目”,然后选择“新建项目”。
2. 在“添加新项目”对话框中,选择“项目类型”窗格中的“安装和部署项目”,然后选择“模板”窗格中的“安装项目”。在“名称”框中键入 ZehuaSoftSetUp。
3. 单击“确定”关闭对话框。
4. 项目被添加到解决方案资源管理器中,并且文件系统编辑器打开。
5. 在“属性”窗口中,选择 ProductName 属性,并键入 水质信息管理及分析评价系统 。
在“属性”窗口中,其它属性,可以自己适当添加
二).将 主程序 项目的输出添加到部署项目中
1. 在“ZehuaSoftSetUp”中,指向“添加”,然后选择“项目输出”。
2. 在“添加项目输出组”对话框中,选择“项目”下拉列表中的“你的程序”。
3. 从列表中选择“主输出”和“内容文件”组,然后单击“确定”。
三).创建安装程序类
1. 在“文件”菜单上指向“新建”,然后选择“项目”。
2. 在“新建项目”对话框中,选择“项目类型”窗格中的“Visual Basic 项目”,然后选择“模板”窗格中的“类库”。在“名称”框中键入 ZehuaSetUpClass。
3. 单击“打开”关闭对话框。
4. 从“项目”菜单中选择“添加新项”。
5. 在“添加新项”对话框中选择“安装程序类”。在“名称”框中键入 SetupClass。
6. 单击“确定”关闭对话框。
7.为了使用多线程,添加OSQL.exe文件,在SQL_Server 中可以找到该文件
8. 详细代码附后。
四).创建自定义安装对话框
1. 在解决方案资源管理器中选择“ZehuaSoftSetUp”项目。在“视图”菜单上指向“编辑器”,然后选择“用户界面”。
2. 在用户界面编辑器中,选择“安装”下的“启动”节点。在“操作”菜单上,选择“添加对话框”。
3. 在“添加对话框”对话框中,选择“许可协议”对话框,然后单击“确定”关闭对话框。
在“许可协议”属性中,添加LicenseFile
4. 在“添加对话框”对话框中,选择“文本框 (A)”对话框,然后单击“确定”关闭对话框。
5. 在“操作”菜单上,选择“上移”。重复此步骤,直到“文本框 (A)”对话框位于“安装文件夹”节点之上(最上面)。
6. 在“属性”窗口中,选择 BannerText 属性并键入:安装数据库.
7. 选择 BodyText 属性并键入:安装程序将在目标机器上安装数据库
8. 选择 Edit1Label 属性并键入:数据库名称:
9. 选择 Edit1Property 属性并键入 DATABASENAME
10. 选择 Edit1Value 属性并键入:water,waterSJSGNQ
11. 选择 Edit2Label 属性并键入:服务器名:
12. 选择 Edit2Property 属性并键入 SERVERNAME
13. 选择 Edit2Value 属性并键入:(local)
14. 选择 Edit3Label 属性并键入:用户名:
15. 选择 Edit3Property 属性并键入 USERNAME
16. 选择 Edit3Value 属性并键入:sa
17. 选择 Edit4Label 属性并键入:密码:
18. 选择 Edit4Property 属性并键入 PASSWORD
19. 选择 Edit3Value 属性并键入
20. 选择 Edit2Visible、Edit3Visible 和 Edit4Visible 属性,并将它们设置为 true
五).创建自定义操作
1. 在解决方案资源管理器中选择“ZehuaSoftSetUp”项目。指向“添加”,然后选择“项目输出”。
2. 在“添加项目输出组”对话框中,选择“项目”下拉列表中的“ZehuaSetUpClass”。
3. 从列表中选择“主输出”和“内容文件”组,然后单击“确定”。
4. 在解决方案资源管理器中选择“ZehuaSoftSetUp”项目。在“视图”菜单上指向“编辑器”,然后选择“自定义操作”。
2. 在自定义操作编辑器中选择“安装”节点。在“操作”菜单上,选择“添加自定义操作”。
3. 在“选择项目中的项”对话框中,双击“应用程序文件夹”。
4. 选择“主输出来自 ZehuaSetUpClass(活动)”项,然后单击“确定”关闭对话框。
5. 在“属性”窗口中,选择 CustomActionData 属性并键入“/dbname=[DATABASENAME] /server=[SERVERNAME] /user=[USERNAME] /pwd=[PASSWORD] /targetdir="[TARGETDIR]"”。
附:/targetdir="[TARGETDIR]"是安装后的目标路径,为了在installDB类中获得安装后的路径,我们设置此参数。
六) 所有的操作向导都可以添加背景图片
添加方式:在"用户界面"->启动->属性->BannerBitMap中添加
七).系统判断客户机器环境方式
最简单方式,用微软PluginInstaller.msi插件,安装后,按照上述部署方式,安装包能就可以智能判断客户机器是否有.net Framwork1.1,MDC 2.0版本,如果系统不具备安装环境,系统会自动提示客户机器安装
八).其它
1.默认安装虚拟目录名称更改方式:
ZehuaSoftSetUp->web应用程序文件夹->属性->VirtuarDirectory-更改你要安装的名称(HwShuiZhi)
2.由于数据库备份文件比较大,建议直接添加把water,waterSJSGNQ添加到ZehuaSoftSetUp 项目中去!
3.三个项目同时编译,如果项目编译通过
编译ZehuaSoftSetUp,生成安装包!
--安装文件类,代码:
' 类说明:该类实现通用的安装
' 作 者: [email protected]
' 新建时间:2005-7-6
' 最后修改:2005-7-6
' 版权所有:北京泽华信息技术有限公司
'/
Imports System.ComponentModel
Imports System.Configuration.Install
Imports System.IO
Imports System.Reflection
1<runinstaller(true)> Public Class SetupClass
2Inherits System.Configuration.Install.Installer
3#Region " 组件设计器生成的代码 "
4
5Public Sub New()
6MyBase.New()
7
8'该调用是组件设计器所必需的。
9InitializeComponent()
10
11'在 InitializeComponent() 调用之后添加任何初始化
12
13End Sub
14
15'Installer 重写 dispose 以清理组件列表。
16Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
17If disposing Then
18If Not (components Is Nothing) Then
19components.Dispose()
20End If
21End If
22MyBase.Dispose(disposing)
23End Sub
24
25'组件设计器所必需的
26Private components As System.ComponentModel.IContainer
27
28'注意: 以下过程是组件设计器所必需的
29'可以使用组件设计器来修改此过程。
30'不要使用代码编辑器来修改它。
31<system.diagnostics.debuggerstepthrough()> Private Sub InitializeComponent()
32components = New System.ComponentModel.Container()
33End Sub
34
35#End Region
36'执行SQL 语句
37Private Sub ExecuteSql(ByVal conn As String, ByVal DatabaseName As String, ByVal Sql As String)
38Dim mySqlConnection As New SqlClient.SqlConnection(conn)
39Dim Command As New SqlClient.SqlCommand(Sql, mySqlConnection)
40Command.Connection.Open()
41Command.Connection.ChangeDatabase(DatabaseName)
42Try
43Command.ExecuteNonQuery()
44Finally
45Command.Connection.Close()
46End Try
47End Sub
48
49
50Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
51MyBase.Install(stateSaver)
52' ------------------------建立数据库-------------------------------------------------
53Try
54Dim connStr As String = String.Format("data source={0};user id={1};password={2};persist security info=false;packet size=4096", Me.Context.Parameters.Item("server"), Me.Context.Parameters.Item("user"), Me.Context.Parameters.Item("pwd"))
55'判断如果目标计算机中有数据库,则删除原来数据库,重新最新数据库
56'(1):支持同时安装多个数据库。
57'(2):支持历史数据装载
58'(3):为支持以后扩充,要写WebConfig时候,WebConfig中必须预留"connString" 字样
59'例子:Me.Context.Parameters.Item("dbname")="water,waterSJSGNQ"
60'得到目标计算机的虚拟目录地址
61Dim stLocation As String
62Dim ASM As [Assembly] = [Assembly].GetExecutingAssembly()
63stLocation = ASM.Location
64Dim dir As System.IO.Directory
65stLocation = dir.GetParent(stLocation).FullName()
66
67Dim DataBaseArray() As String
68Dim Loopi As Integer
69DataBaseArray = Split(Me.Context.Parameters.Item("dbname"), ",")
70For Loopi = 0 To UBound(DataBaseArray)
71'建立数据库,未加栽数据
72ExecuteSql(connStr, "master", "IF EXISTS (SELECT * FROM MASTER..sysdatabases WHERE NAME=N'" & DataBaseArray(Loopi) & " ') DROP DATABASE " & DataBaseArray(Loopi) & " CREATE DATABASE " & DataBaseArray(Loopi) & " ")
73'加载历史数据
74CreateDataBase(DataBaseArray(Loopi), stLocation)
75'将连接字符串写入Web.config,为将来预留程序接口
76'WriteWebConfig(DataBaseArray(Loopi))
77Next
78'删除目标计算机的OSQL文件
79Dim sqlFileInfo As New System.IO.FileInfo(String.Format("{0}OSQL.EXE", Me.Context.Parameters.Item("targetdir")))
80If sqlFileInfo.Exists Then
81sqlFileInfo.Delete()
82End If
83Catch ex As Exception
84Throw ex
85End Try
86
87
88End Sub
89
90
91'在数据库实现数据加载
92Private Sub CreateDataBase(ByVal DatabaseName As String, ByVal stLocation As String)
93Dim connStr As String = String.Format("data source={0};user id={1};password={2};persist security info=false;packet size=4096", Me.Context.Parameters.Item("server"), Me.Context.Parameters.Item("user"), Me.Context.Parameters.Item("pwd"))
94'调用OSQL,实现数据的装载
95Dim SQLString As String
96SQLString = "use master declare @Data_Path as varchar(100),@Log_Path as varchar(100) "
97SQLString = SQLString + " select @Data_Path=ltrim(rtrim(filename)) from " & DatabaseName & "..sysfiles where charindex(''MDF'',filename)>0 "
98SQLString = SQLString + " select @Log_Path=ltrim(rtrim(filename)) from " & DatabaseName & "..sysfiles where charindex(''LDF'',filename)>0 "
99SQLString = SQLString + " RESTORE DATABASE " & DatabaseName & " FROM DISK = ''" & stLocation & "\" & DatabaseName & ".bak'' with replace, move ''" & DatabaseName & "_Data'' to @Data_Path, move ''" & DatabaseName & "_Log'' to @Log_Path "
100SQLString = " exec('master..xp_cmdShell '' osql -U " & Me.Context.Parameters.Item("user") & " -P " & Me.Context.Parameters.Item("pwd") & " -S " & Me.Context.Parameters.Item("targetdir") & " -Q '' " & SQLString & " ') "
101
102Dim sqlProcess As New System.Diagnostics.Process
103sqlProcess.StartInfo.FileName = "osql.exe "
104sqlProcess.StartInfo.Arguments = SQLString
105ExecuteSql(connStr, "master", SQLString)
106sqlProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
107sqlProcess.Start()
108sqlProcess.WaitForExit() '等待执行
109sqlProcess.Close()
110'删除目标计算机的数据库备份文件
111Dim sqlFileInfo As New System.IO.FileInfo(String.Format("{0}" & DatabaseName & ".bak", Me.Context.Parameters.Item("targetdir")))
112If sqlFileInfo.Exists Then
113sqlFileInfo.Delete()
114End If
115End Sub
116
117
118' ---------------------将连接字符串写入Web.config-----------------------------------
119Private Sub WriteWebConfig(ByVal DatabaseName As String)
120Dim di As IO.DirectoryInfo
121di = New IO.DirectoryInfo(Me.Context.Parameters.Item("targetdir"))
122Dim fi As IO.FileInfo
123For Each fi In di.GetFiles("web.config")
124ProcessString(fi.FullName, DatabaseName)
125Next
126End Sub
127
128Public Sub ProcessString(ByVal FileName As String, ByVal DatabaseName As String)
129Try
130Dim FileInfo As System.IO.FileInfo = New System.IO.FileInfo(FileName)
131If Not FileInfo.Exists Then
132Throw New InstallException("没有找到配置文件")
133End If
134'实例化XML文档
135Dim XmlDocument As New System.Xml.XmlDocument
136XmlDocument.Load(FileInfo.FullName)
137'查找到appSettings中的节点
138Dim Node As System.Xml.XmlNode
139Dim FoundIt As Boolean = False
140For Each Node In XmlDocument.Item("configuration").Item("appSettings")
141If Node.Name = "add" Then
142If Node.Attributes.GetNamedItem("key").Value = "connString" Then
143'写入连接字符串
144Node.Attributes.GetNamedItem("value").Value = String.Format("Persist Security Info=False;Data Source={0};Initial Catalog={1};User ID={2};Password={3};Packet Size=4096;Pooling=true;Max Pool Size=100;Min Pool Size=1", _
145Me.Context.Parameters.Item("server"), DatabaseName, Me.Context.Parameters.Item("user"), Me.Context.Parameters.Item("pwd"))
146FoundIt = True
147End If
148End If
149Next Node
150If Not FoundIt Then
151Throw New InstallException("web.Config 文件没有包含connString连接字符串设置")
152End If
153XmlDocument.Save(FileInfo.FullName)
154Catch ex As Exception
155Throw ex
156End Try
157End Sub
158
159
160End Class</system.diagnostics.debuggerstepthrough()></runinstaller(true)>