演练:安装时使用自定义操作创建数据库

更新:2007 年 11 月

下面的演练演示在安装期间如何使用自定义操作和 CustomActionData 属性创建数据库和数据库表。

说明:

此演练要求应用程序部署到的计算机上有 SQL Server。

说明:

显示的对话框和菜单命令可能会与“帮助”中的描述有所不同,具体取决于当前设置或版本。若要更改设置,请单击“工具”菜单上的“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置

说明:

下面的说明演示如何使用 Visual Basic 项目创建部署项目,其一般原则适用于所有支持部署基于 Windows 的应用程序的 Visual Studio 语言项目。

创建安装程序类

  1. 在“文件”菜单上单击“新建项目”。

  2. 在“新建项目”对话框中,选择“项目类型”窗格中的“Visual Basic 项目”,然后选择“模板”窗格中的“类库”。在“名称”框中键入 DBCustomAction。

  3. 在“项目”菜单上单击“添加新项”。

  4. 在“添加新项”对话框中选择“安装程序类”。在“名称”框中键入 VbDeployInstaller.vb。

创建数据连接对象

  1. 在“服务器资源管理器”中,选择“数据连接”。右击“数据连接”,再单击“添加连接”。

  2. 在“选择数据源”对话框中,选择“Microsoft SQL Server”。

  3. 在“添加连接”对话框中,执行以下操作:

    1. 在“服务器名称”列表中,键入或选择一个服务器名称。

    2. 选择“使用 Windows 身份验证”。

    3. 在“数据库”框中,键入 master。

    4. 单击“确定”关闭对话框。

  4. 在“数据”菜单中单击“添加新数据源”,然后使用向导添加在之前步骤中建立的连接。若要验证数据源是否在项目中,请单击“数据”菜单上的“显示数据源”。

创建包含 SQL 语句的文本文件以创建数据库

  1. 在“解决方案资源管理器”中选择 DBCustomAction 项目。在“项目”菜单上单击“添加新项”。

  2. 在“添加新项”对话框中单击“文本文件”。在“名称”框中键入 sql.txt(必须小写)。

  3. 将以下内容添加到 sql.txt 文件中:

    CREATE TABLE [dbo].[Employees] (
    [Name] [char] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [Rsvp] [int] NULL ,
    [Requests] [nvarchar] (4000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL 
    ) ON [PRIMARY];
    
    ALTER TABLE [dbo].[Employees] WITH NOCHECK ADD 
    CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED 
    (
    [Name]
    ) ON [PRIMARY];
    
  4. 在“解决方案资源管理器”中选择 sql.txt。在“属性”窗口中,将“BuildAction”属性设置为“嵌入的资源”。

将代码添加到安装程序类中以阅读文本文件

  1. 在“解决方案资源管理器”中选择 VbDeployInstaller.vb。在“视图”菜单上单击“代码”。

  2. 在模块的顶部添加下面的 Imports 语句:

    Imports System.IO
    Imports System.Reflection
    Imports System.Data.SqlClient
    
  3. 在 MyBase.New 的声明后,将下面的代码添加到 VbDeployInstaller 类:

    Public Class VbDeployInstaller
    
        Dim masterConnection As New System.Data.SqlClient.SqlConnection
    
        Public Sub New()
            MyBase.New()
    
            'This call is required by the Component Designer.
            InitializeComponent()
    
            'Add initialization code after the call to InitializeComponent
    
        End Sub
    
        Private Function GetSql(ByVal Name As String) As String
            Try
    
                ' Gets the current assembly.
                Dim Asm As [Assembly] = [Assembly].GetExecutingAssembly()
    
                ' Resources are named using a fully qualified name.
                Dim strm As Stream = Asm.GetManifestResourceStream( _
                  Asm.GetName().Name + "." + Name)
    
                ' Reads the contents of the embedded file.
                Dim reader As StreamReader = New StreamReader(strm)
                Return reader.ReadToEnd()
    
            Catch ex As Exception
                MsgBox("In GetSQL: " & ex.Message)
                Throw ex
            End Try
        End Function
    
        Private Sub ExecuteSql(ByVal DatabaseName As String, ByVal Sql As String)
            Dim Command As New SqlClient.SqlCommand(Sql, masterConnection)
    
            ' Initialize the connection, open it, and set it to the "master" database
            masterConnection.ConnectionString = My.Settings.masterConnectionString
            Command.Connection.Open()
            Command.Connection.ChangeDatabase(DatabaseName)
            Try
                Command.ExecuteNonQuery()
            Finally
                ' Closing the connection should be done in a Finally block
                Command.Connection.Close()
            End Try
        End Sub
    
        Protected Sub AddDBTable(ByVal strDBName As String)
            Try
                ' Creates the database.
                ExecuteSql("master", "CREATE DATABASE " + strDBName)
    
                ' Creates the tables.
                ExecuteSql(strDBName, GetSql("sql.txt"))
    
            Catch ex As Exception
                ' Reports any errors and abort.
                MsgBox("In exception handler: " & ex.Message)
                Throw ex
            End Try
        End Sub
    
        Public Overrides Sub Install(ByVal stateSaver As _
          System.Collections.IDictionary)
    
            MyBase.Install(stateSaver)
            AddDBTable(Me.Context.Parameters.Item("dbname"))
        End Sub
    
    End Class
    
  4. 在“生成”菜单上单击“生成 DBCustomAction”。

创建部署项目

  1. 在“文件”菜单中单击“添加”,然后单击“新建项目”。

  2. 在“添加新项目”对话框中,打开“其他项目类型”节点,在“项目类型”窗格中选择“安装和部署项目”。然后,在“模板”窗格中选择“安装项目”。在“名称”框中键入 DBCustomAction_Setup。

  3. 在“属性”窗口中,选择“ProductName”属性并键入 DB Installer。

  4. 在“文件系统编辑器”中,选择“应用程序文件夹”。在“操作”菜单上单击“添加”,然后单击“项目输出”。

  5. 在“添加项目输出组”对话框中,为“DBCustomAction”项目选择“主输出”。

创建自定义安装对话框

  1. 在“解决方案资源管理器”中选择“DBCustomAction_Setup”项目。在“视图”菜单上指向“编辑器”,再单击“用户界面”。

  2. 在“用户界面编辑器”中,选择“安装”下面的“启动”节点。在“操作”菜单上单击“添加对话框”。

  3. 在“添加对话框”对话框中,选择“文本框(A)”对话框,再单击“确定”。

  4. 在“操作”菜单上单击“上移”。重复此步骤,直到“文本框(A)”对话框位于“安装文件夹”节点之上。

  5. 在“属性”窗口中,选择“BannerText”属性并键入“指定数据库名称”。

  6. 选择“BodyText”属性并键入“此对话框允许指定将在数据库服务器上创建的数据库的名称”。

  7. 选择“Edit1Label”属性并键入“数据库名称:”。

  8. 选择“Edit1Property”属性并键入 CUSTOMTEXTA1。

  9. 选择“Edit2Visible”、“Edit3Visible”和“Edit4Visible”属性,将它们设置为“False”。

创建自定义操作

  1. 在“解决方案资源管理器”中选择“DBCustomAction_Setup”项目。在“视图”菜单上指向“编辑器”,然后单击“自定义操作”。

  2. 在“自定义操作编辑器”中选择“安装”节点。在“操作”菜单上单击“添加自定义操作”。

  3. 在“选择项目中的项”对话框中,双击“应用程序文件夹”。

  4. 选择“DBCustomAction 的主输出(活动)”,然后单击“确定”关闭对话框。

  5. 确保在“自定义操作编辑器”中选择了“DBCustomAction 的主输出(活动)”项。在“属性”窗口中,选择“CustomActionData”属性并键入 /dbname=[CUSTOMTEXTA1]。

  6. 在“生成”菜单上单击“生成 DBCustomAction_Setup”。

在开发计算机上安装应用程序

  • 在“解决方案资源管理器”中选择“DBCustomAction_Setup”项目。在“项目”菜单上单击“安装”。

    这将在开发计算机上运行安装程序。

    说明:

    您必须在计算机上拥有安装权限才能运行该安装程序。

将应用程序部署到其他计算机

  1. 在“Windows 资源管理器”中,定位到项目目录并找到生成的安装程序。默认路径为 \documents and settings\您的登录名\DBCustomAction_Setup\项目配置\ DBCustomAction_Setup.msi。默认项目配置为“调试”。

  2. 将 DBCustomAction_Setup.msi 以及该目录下的其他所有文件和子目录复制到另一台计算机上。

    说明:

    若要在未联网的计算机上安装应用程序,请将文件复制到诸如 CD-ROM 之类的传统媒体中。

    在目标计算机上双击 Setup.exe 文件运行安装程序。

    说明:

    您必须在计算机上拥有安装权限才能运行该安装程序。

卸载应用程序

  1. 在 Windows“控制面板”中双击“添加/删除程序”。

  2. 在“添加或删除程序”对话框中选择“DBCustomAction_Setup”,单击“删除”,再单击“确定”,以关闭该对话框。

    提示:

    若要从开发计算机上卸载该应用程序,请在“项目”菜单上单击“卸载”。

请参见

概念

自定义操作中的错误处理

参考

CustomActionData 属性

其他资源

部署中的自定义操作管理