安装和部署,同时支持多个数据库安装.

/* 说明:本安装方法,是以实际工作为例,测试通过!

*/

一).创建部署项目

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'" &amp; DataBaseArray(Loopi) &amp; " ') DROP DATABASE " &amp; DataBaseArray(Loopi) &amp; " CREATE DATABASE " &amp; DataBaseArray(Loopi) &amp; " ")   
 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 " &amp; DatabaseName &amp; "..sysfiles where charindex(''MDF'',filename)&gt;0 "   
 98SQLString = SQLString + " select @Log_Path=ltrim(rtrim(filename)) from " &amp; DatabaseName &amp; "..sysfiles where charindex(''LDF'',filename)&gt;0 "   
 99SQLString = SQLString + " RESTORE DATABASE " &amp; DatabaseName &amp; " FROM DISK = ''" &amp; stLocation &amp; "\" &amp; DatabaseName &amp; ".bak'' with replace, move ''" &amp; DatabaseName &amp; "_Data'' to @Data_Path, move ''" &amp; DatabaseName &amp; "_Log'' to @Log_Path "   
100SQLString = " exec('master..xp_cmdShell '' osql -U " &amp; Me.Context.Parameters.Item("user") &amp; " -P " &amp; Me.Context.Parameters.Item("pwd") &amp; " -S " &amp; Me.Context.Parameters.Item("targetdir") &amp; " -Q '' " &amp; SQLString &amp; " ') " 
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}" &amp; DatabaseName &amp; ".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)>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus