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

来源:互联网 发布:java b2b2c源码下载 编辑:程序博客网 时间:2024/05/22 13:23
 

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

*/

一).创建部署项目

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,生成安装包!
--安装文件类,代码:

' 类说明:该类实现通用的安装
' 作    者:
zlp@zehua.com.cn
' 新建时间:2005-7-6
' 最后修改:2005-7-6
' 版权所有:北京泽华信息技术有限公司
'/
Imports System.ComponentModel
Imports System.Configuration.Install
Imports System.IO
Imports System.Reflection
<RunInstaller(True)> Public Class SetupClass
    Inherits System.Configuration.Install.Installer
#Region " 组件设计器生成的代码 "
    Public Sub New()
        MyBase.New()
        '该调用是组件设计器所必需的。
        InitializeComponent()
        '在 InitializeComponent() 调用之后添加任何初始化
    End Sub
    'Installer 重写 dispose 以清理组件列表。
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub
    '组件设计器所必需的
    Private components As System.ComponentModel.IContainer
    '注意: 以下过程是组件设计器所必需的
    '可以使用组件设计器来修改此过程。
    '不要使用代码编辑器来修改它。
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        components = New System.ComponentModel.Container()
    End Sub
#End Region
    '执行SQL 语句
    Private Sub ExecuteSql(ByVal conn As String, ByVal DatabaseName As String, ByVal Sql As String)
        Dim mySqlConnection As New SqlClient.SqlConnection(conn)
        Dim Command As New SqlClient.SqlCommand(Sql, mySqlConnection)
        Command.Connection.Open()
        Command.Connection.ChangeDatabase(DatabaseName)
        Try
            Command.ExecuteNonQuery()
        Finally
            Command.Connection.Close()
        End Try
    End Sub

    Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
        MyBase.Install(stateSaver)
        ' ------------------------建立数据库-------------------------------------------------
        Try
            Dim 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"))
            '判断如果目标计算机中有数据库,则删除原来数据库,重新最新数据库
            '(1):支持同时安装多个数据库。
            '(2):支持历史数据装载
            '(3):为支持以后扩充,要写WebConfig时候,WebConfig中必须预留"connString" 字样
            '例子:Me.Context.Parameters.Item("dbname")="water,waterSJSGNQ"
            '得到目标计算机的虚拟目录地址
            Dim stLocation As String
            Dim ASM As [Assembly] = [Assembly].GetExecutingAssembly()
            stLocation = ASM.Location
            Dim dir As System.IO.Directory
            stLocation = dir.GetParent(stLocation).FullName()
            Dim DataBaseArray() As String
            Dim Loopi As Integer
            DataBaseArray = Split(Me.Context.Parameters.Item("dbname"), ",")
            For Loopi = 0 To UBound(DataBaseArray)
                '建立数据库,未加栽数据
                ExecuteSql(connStr, "master", "IF EXISTS (SELECT * FROM MASTER..sysdatabases WHERE NAME=N'" & DataBaseArray(Loopi) & " ') DROP DATABASE " & DataBaseArray(Loopi) & "  CREATE DATABASE " & DataBaseArray(Loopi) & "   ")
                '加载历史数据
                CreateDataBase(DataBaseArray(Loopi), stLocation)
                '将连接字符串写入Web.config,为将来预留程序接口
                'WriteWebConfig(DataBaseArray(Loopi))
            Next
            '删除目标计算机的OSQL文件
            Dim sqlFileInfo As New System.IO.FileInfo(String.Format("{0}OSQL.EXE", Me.Context.Parameters.Item("targetdir")))
            If sqlFileInfo.Exists Then
                sqlFileInfo.Delete()
            End If
        Catch ex As Exception
            Throw ex
        End Try

    End Sub

    '在数据库实现数据加载
    Private Sub CreateDataBase(ByVal DatabaseName As String, ByVal stLocation As String)
        Dim 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"))
        '调用OSQL,实现数据的装载
        Dim SQLString As String
        SQLString = "use master    declare @Data_Path as varchar(100),@Log_Path as varchar(100)     "
        SQLString = SQLString + " select @Data_Path=ltrim(rtrim(filename)) from " & DatabaseName & "..sysfiles where charindex(''MDF'',filename)>0 "
        SQLString = SQLString + " select @Log_Path=ltrim(rtrim(filename)) from " & DatabaseName & "..sysfiles where charindex(''LDF'',filename)>0  "
        SQLString = SQLString + " RESTORE DATABASE " & DatabaseName & " FROM DISK = ''" & stLocation & "/" & DatabaseName & ".bak'' with replace, move ''" & DatabaseName & "_Data'' to @Data_Path, move ''" & DatabaseName & "_Log'' to @Log_Path "
        SQLString = " 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 & " ') "
        Dim sqlProcess As New System.Diagnostics.Process
        sqlProcess.StartInfo.FileName = "osql.exe "
        sqlProcess.StartInfo.Arguments = SQLString
        ExecuteSql(connStr, "master", SQLString)
        sqlProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
        sqlProcess.Start()
        sqlProcess.WaitForExit()  '等待执行
        sqlProcess.Close()
        '删除目标计算机的数据库备份文件
        Dim sqlFileInfo As New System.IO.FileInfo(String.Format("{0}" & DatabaseName & ".bak", Me.Context.Parameters.Item("targetdir")))
        If sqlFileInfo.Exists Then
            sqlFileInfo.Delete()
        End If
    End Sub

    ' ---------------------将连接字符串写入Web.config-----------------------------------
    Private Sub WriteWebConfig(ByVal DatabaseName As String)
            Dim di As IO.DirectoryInfo
            di = New IO.DirectoryInfo(Me.Context.Parameters.Item("targetdir"))
            Dim fi As IO.FileInfo
            For Each fi In di.GetFiles("web.config")
            ProcessString(fi.FullName, DatabaseName)
            Next
    End Sub
    Public Sub ProcessString(ByVal FileName As String, ByVal DatabaseName As String)
        Try
            Dim FileInfo As System.IO.FileInfo = New System.IO.FileInfo(FileName)
            If Not FileInfo.Exists Then
                Throw New InstallException("没有找到配置文件")
            End If
            '实例化XML文档
            Dim XmlDocument As New System.Xml.XmlDocument
            XmlDocument.Load(FileInfo.FullName)
            '查找到appSettings中的节点
            Dim Node As System.Xml.XmlNode
            Dim FoundIt As Boolean = False
            For Each Node In XmlDocument.Item("configuration").Item("appSettings")
                If Node.Name = "add" Then
                    If Node.Attributes.GetNamedItem("key").Value = "connString" Then
                        '写入连接字符串
                        Node.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", _
                        Me.Context.Parameters.Item("server"), DatabaseName, Me.Context.Parameters.Item("user"), Me.Context.Parameters.Item("pwd"))
                        FoundIt = True
                    End If
                End If
            Next Node
            If Not FoundIt Then
                Throw New InstallException("web.Config 文件没有包含connString连接字符串设置")
            End If
            XmlDocument.Save(FileInfo.FullName)
        Catch ex As Exception
            Throw ex
        End Try
    End Sub

End Class