Click here to Skip to main content
11,570,352 members (57,933 online)
Click here to Skip to main content

Deploy your Application and Database

, 3 Nov 2006 CPOL 155.1K 7.9K 112
Rate this:
Please Sign up or sign in to vote.
Describes how to add custom script to install project

Introduction

This article describes a simple way to deploy your application and database. Once the development and testing of application are done, it is necessary to create some script that installs your application to the target computer. In VS2003/2005, it can be done by adding setup project to your solution and performing build on it. Get more information about setup projects on the MSDN site. But sometimes, the situation is more complicated.

Database

Usually your application has some storage for saving its data. In my example, we are talking about SQL server database. My database is schema (table definitions), stored procedures and some predefined data (like ENUMs, application users and so on, that are stored in database). So as you can see, my Setup project is not only script that deploys application's binaries to target computer but also contains some logic for finding local SQL server (can be modified to find any SQL server in local network), creating database and inserting all predefined application data. The following steps will describe how it can be done.

Step 1

Perform backup operation on your database. It can be done in SQL EM. Choose your database, perform right click and choose backup database. See picture 1:

Sample screenshot

Picture 1

After choosing backup database, in SQL Server backup form, click add button and choose backup file name. (In my example, I called it dbBackup.) See picture 2.

Sample screenshot

Picture 2

Finally, click OK button and Backup will be executed. The created file will contain your database information.

Step 2

Now add your file to your Setup project. Perform Right click on setup project in (Visual Studio). See Picture 3:

Sample screenshot

Picture 3

In file dialog, choose dbBackUp file and perform build. Now your msi contains dbBackupFile, that will be copied to the target directory during setup process.

Step 3

Create a new project (SetupScripts) that will contain your deployment logic. Add a new class that inherits from System.Configuration.Install.Installer (Installer class in Add New Item dialog) and perform override on Install method. In Step 5, I'll give more explanation about the Install method. Compile your project.

Step 4

Now perform right mouse click on your setup project and click Custom actions. See picture 4.

Sample screenshot

Picture 4

In custom actions screen, click on install folder and add SetupScripts.dll from the previous step. Now during install, your SetupScript.dll will be used, so if it contains a class that inherits from Installer (as we've done in step 3), the Installer's class Install method will be invoked. You can pass parameters to your install method by performing the following steps: Right mouse click on SetupScripts.dll in Custom actions -> Install folder. Go to properties window and add parameters to CustomActionData row. See picture 5.

Sample screenshot

Picture 5

Step 5

Finally, we can add code that installs the database.

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 is a class that performs database install. (You can find its full code in the attached ZIP file). Now I'll show only its execute and GetConnStringToLocalServer() methods.

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" );
}

Ok folks, that’s all. May be one more tip, install code is extremely hard to debug, so use logging mechanism to log almost every step of install operation. In the attached code (in ZIP file), I've used regular Windows Form to see the installation progress status. Use this example to create something more elegant.

History

  • 3rd November, 2006: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Dima Statz
Retired
Israel Israel
Name: Statz Dima
Fields of interest: software

You may also be interested in...

Comments and Discussions

 
QuestionProblem with deployment of sql server database project Pin
Subrata Sinha2-Jun-15 1:35
memberSubrata Sinha2-Jun-15 1:35 
QuestionExplain Step 3 in detail Pin
Member 1143775713-May-15 1:35
memberMember 1143775713-May-15 1:35 
QuestionSQL Server 2008 Express Edition is configured as prerequisite Pin
Syed Jahanzeb2-Mar-15 9:37
memberSyed Jahanzeb2-Mar-15 9:37 
GeneralThank you Pin
Member 113448001-Jan-15 17:30
memberMember 113448001-Jan-15 17:30 
Questiondeploy your application and database Pin
louis Tunde10-Sep-14 11:32
memberlouis Tunde10-Sep-14 11:32 
Questiondeploy your application and database Pin
louis Tunde10-Sep-14 11:23
memberlouis Tunde10-Sep-14 11:23 
GeneralNot working!!! Pin
Member 982544226-Jan-14 23:04
memberMember 982544226-Jan-14 23:04 
Questiongot stuck at step 3 Pin
daviegy7-May-13 7:25
memberdaviegy7-May-13 7:25 
GeneralMy vote of 4 Pin
Shubh Agrahari30-Jan-13 20:16
memberShubh Agrahari30-Jan-13 20:16 
Questionwhat if I am using mysql? Pin
Bsa0330-Jan-13 7:40
memberBsa0330-Jan-13 7:40 
GeneralMy vote of 5 Pin
renjuvinod12-Aug-12 20:05
memberrenjuvinod12-Aug-12 20:05 
Excellent
Questioncustom action data property is not clear Pin
jackthomson22-Jul-12 8:08
memberjackthomson22-Jul-12 8:08 
QuestionStuck with CustomActionData Pin
sersheed16-Jul-12 2:15
membersersheed16-Jul-12 2:15 
QuestionDeploy Database File to Client PC without to install SQL Server Pin
h0k3n91-Jun-12 18:41
memberh0k3n91-Jun-12 18:41 
QuestionDeploy your Application and Database Pin
aloknetuser11-Apr-12 2:20
memberaloknetuser11-Apr-12 2:20 
GeneralMy vote of 5 Pin
Member 830647410-Oct-11 16:21
memberMember 830647410-Oct-11 16:21 
GeneralStuck at step 3. [modified] Pin
JayEnAr25-May-11 23:45
memberJayEnAr25-May-11 23:45 
QuestionDeploy your Application and Database? Pin
ibrahimonat29-Jan-11 13:06
memberibrahimonat29-Jan-11 13:06 
GeneralMy vote of 5 Pin
ANKHE8-Jul-10 3:53
memberANKHE8-Jul-10 3:53 
GeneralRe: My vote of 5 Pin
galam20097-Dec-10 17:46
membergalam20097-Dec-10 17:46 
Generalattach sql backup file in msi Pin
mbrawat17-Jun-10 4:17
membermbrawat17-Jun-10 4:17 
GeneralPlease send me the solution Pin
vamajor8-Jun-10 6:42
membervamajor8-Jun-10 6:42 
GeneralRe: Please send me the solution Pin
vamajor8-Jun-10 6:42
membervamajor8-Jun-10 6:42 
Generalsample application Pin
mbrawat7-Jun-10 3:04
membermbrawat7-Jun-10 3:04 
GeneralRe: sample application Pin
jackthomson22-Jul-12 8:13
memberjackthomson22-Jul-12 8:13 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.150624.2 | Last Updated 3 Nov 2006
Article Copyright 2006 by Dima Statz
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid