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






4.38/5 (29投票s)
描述了如何向安装项目添加自定义脚本。
引言
本文介绍了一种部署您的应用程序和数据库的简单方法。一旦应用程序的开发和测试完成,就需要创建一些脚本,将您的应用程序安装到目标计算机上。在 VS2003/2005 中,可以通过向您的解决方案添加 *安装项目 * 并对其执行构建来实现。在 MSDN 站点上获取有关安装项目的更多信息。但有时,情况会更加复杂。
数据库
通常,您的应用程序有一些存储来保存其数据。在我的示例中,我们谈论的是 SQL server 数据库。我的数据库是模式(表定义)、存储过程和一些预定义数据(如 ENUM、应用程序用户等,它们存储在数据库中)。所以正如您所看到的,我的 *安装项目 * 不仅是部署应用程序二进制文件到目标计算机的脚本,还包含一些用于查找本地 SQL server(可以修改为查找本地网络中的任何 SQL server)、创建数据库和插入所有预定义应用程序数据的逻辑。以下步骤将描述如何完成。
步骤 1
对您的数据库执行备份操作。这可以在 SQL EM 中完成。选择您的数据库,右键单击并选择备份数据库。见 图片 1
选择备份数据库后,在 SQL Server 备份窗体中,单击 添加按钮 并选择备份文件名。(在我的示例中,我称之为 dbBackup
。)见 图片 2。
最后,单击确定按钮,备份将被执行。创建的文件将包含您的数据库信息。
第二步
现在将您的文件添加到您的安装项目中。在(Visual Studio)中的安装项目上执行右键单击。见 图片 3
在文件对话框中,选择 dbBackUp
文件并执行构建。现在您的 msi 包含 dbBackupFile
,它将在安装过程中被复制到目标目录。
步骤 3
创建一个新的项目(SetupScripts
),它将包含您的部署逻辑。添加一个从 System.Configuration.Install.Installer
(在“添加新项”对话框中的 Installer 类)继承的新类,并在 Install
方法上执行重写。在步骤 5 中,我将对 Install
方法给出更多解释。编译您的项目。
步骤 4
现在对您的安装项目执行鼠标右键单击,然后单击“自定义操作”。见 图片 4。
在“自定义操作”屏幕中,单击“安装”文件夹,然后从上一步中添加 SetupScripts.dll。现在,在安装过程中,将使用您的 SetupScript.dll,因此,如果它包含一个从 Installer 继承的类(正如我们在步骤 3 中所做的那样),Installer 类的 Install
方法将被调用。您可以通过执行以下步骤将参数传递给您的 install
方法:在“自定义操作”->“安装”文件夹中,对 SetupScripts.dll 执行鼠标右键单击。转到“属性”窗口并将参数添加到 CustomActionData
行。见 图片 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 日:首次发布