65.9K
CodeProject 正在变化。 阅读更多。
Home

部署您的应用程序和数据库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.38/5 (29投票s)

2006年11月3日

CPOL

3分钟阅读

viewsIcon

307875

downloadIcon

10155

描述了如何向安装项目添加自定义脚本。

引言

本文介绍了一种部署您的应用程序和数据库的简单方法。一旦应用程序的开发和测试完成,就需要创建一些脚本,将您的应用程序安装到目标计算机上。在 VS2003/2005 中,可以通过向您的解决方案添加 *安装项目 * 并对其执行构建来实现。在 MSDN 站点上获取有关安装项目的更多信息。但有时,情况会更加复杂。

数据库

通常,您的应用程序有一些存储来保存其数据。在我的示例中,我们谈论的是 SQL server 数据库。我的数据库是模式(表定义)、存储过程和一些预定义数据(如 ENUM、应用程序用户等,它们存储在数据库中)。所以正如您所看到的,我的 *安装项目 * 不仅是部署应用程序二进制文件到目标计算机的脚本,还包含一些用于查找本地 SQL server(可以修改为查找本地网络中的任何 SQL server)、创建数据库和插入所有预定义应用程序数据的逻辑。以下步骤将描述如何完成。

步骤 1

对您的数据库执行备份操作。这可以在 SQL EM 中完成。选择您的数据库,右键单击并选择备份数据库。见 图片 1

Sample screenshot

Picture 1

选择备份数据库后,在 SQL Server 备份窗体中,单击 添加按钮 并选择备份文件名。(在我的示例中,我称之为 dbBackup。)见 图片 2

Sample screenshot

Picture 2

最后,单击确定按钮,备份将被执行。创建的文件将包含您的数据库信息。

第二步

现在将您的文件添加到您的安装项目中。在(Visual Studio)中的安装项目上执行右键单击。见 图片 3

Sample screenshot

图 3

在文件对话框中,选择 dbBackUp 文件并执行构建。现在您的 msi 包含 dbBackupFile,它将在安装过程中被复制到目标目录。

步骤 3

创建一个新的项目(SetupScripts),它将包含您的部署逻辑。添加一个从 System.Configuration.Install.Installer (在“添加新项”对话框中的 Installer 类)继承的新类,并在 Install 方法上执行重写。在步骤 5 中,我将对 Install 方法给出更多解释。编译您的项目。

步骤 4

现在对您的安装项目执行鼠标右键单击,然后单击“自定义操作”。见 图片 4

Sample screenshot

Picture 4

在“自定义操作”屏幕中,单击“安装”文件夹,然后从上一步中添加 SetupScripts.dll。现在,在安装过程中,将使用您的 SetupScript.dll,因此,如果它包含一个从 Installer 继承的类(正如我们在步骤 3 中所做的那样),Installer 类的 Install 方法将被调用。您可以通过执行以下步骤将参数传递给您的 install 方法:在“自定义操作”->“安装”文件夹中,对 SetupScripts.dll 执行鼠标右键单击。转到“属性”窗口并将参数添加到 CustomActionData 行。见 图片 5

Sample screenshot

Picture 5

步骤 5

最后,我们可以添加安装数据库的代码。

public override void Install(System.Collections.IDictionary stateSaver)
{
    try
    {   
        base.Install( stateSaver );   
        SetupDataBase db = new SetupDataBase();
        // Database name to create
        db.DbName = Context.Parameters["dbName"]; 
        log.WriteLine( "Database name: " + db.DbName );
        // Backup file ( full name ) 
        db.BackUpFilePath = Context.Parameters["BackUpFile"]; 
        log.WriteLine( "Backup file: " + db.BackUpFilePath );
        // Application config file ( to update connection string )
        db.AppConfigFileName =    Context.Parameters["ConfigFile"];
        log.WriteLine( "Config file: " + db.AppConfigFileName );
        // Application file                
        db.AppPath = Context.Parameters["AppPath"];
        log.WriteLine( "AppPath: " + db.AppPath );
        db.m_datFilePath = Context.Parameters["DATFile"];   
        log.WriteLine( "DATFile: " + db.m_datFilePath );
        db.Execute();           
    }           
    catch( Exception e ) 
    {  
        throw new ApplicationException("Database creation fault: \n" + e.Message );
    }                
}

Setup database 是一个执行数据库安装的类。(您可以在附加的 ZIP 文件中找到它的完整代码)。现在我只展示它的 execute 和 GetConnStringToLocalServer() 方法。

public void Execute() 
{             
    SqlCommand cmd = null;            
    SqlConnection conn = null;
    try            
    {                
        // Create connection string to database

        string connString = GetConnStringToLocalServer(); 
        conn = new SqlConnection( connString );    
        // Create query to perform on DB           
        string query = string.Format(               
            @"restore database {1} from disk='{2}{0}'",
            m_backUpFilePath,                  
            m_dbName,                    
            m_datFilePath            );        
        // Create SQL command             
        cmd = new SqlCommand( query, conn );     
        cmd.CommandType = CommandType.Text;
        conn.Open();              
        cmd.ExecuteNonQuery(); 
        // Get              
        string[] parts = connString.Split( new char[] { ';' } );
        foreach( string part in parts )             
        {                  
            if( part.StartsWith( "Initial" ) )
            {                     
                connString = connString.Replace(      
                    part,                     
                    string.Format( "Initial Catalog={0}", m_dbName)
                    );
            }
        }                 
        // Update Connection string in application's config
        UpdateAttribute( connString );
    }            
    finally            
    {                
        if( cmd != null ) cmd.Dispose(); 
        if( conn != null ) conn.Dispose(); 
    }        
}

private string GetConnStringToLocalServer()
{            
    SqlDataSourceEnumerator sqlEnum = SqlDataSourceEnumerator.Instance;
    DataTable table = sqlEnum.GetDataSources();
    // Get local machine name 

    string machineName = Environment.MachineName;    
    foreach( DataRow row in table.Rows )   
    {               
        if( row[0].ToString() == machineName )
        {                 
            string connString = string.Format(
                "Persist Security Info=False;Integrated Security=SSPI;" +
                "Initial Catalog=master;Data Source={0}",
                machineName );
            return connString;   
        }
    }
    throw new ApplicationException( "No local sql Server is installed" );
}

好了,伙计们,就这些。可能还有一个提示,安装代码非常难调试,所以使用日志记录机制来记录几乎每个安装操作步骤。在附加的代码(在 ZIP 文件中)中,我使用了常规的 Windows 窗体来查看安装进度状态。使用此示例来创建一些更优雅的东西。

历史

  • 2006 年 11 月 3 日:首次发布
© . All rights reserved.