如果你的程序不涉及数据库,则跳过数据库的部分。
首先需要把你要建立的数据库表结构导出来,使用slqserver的导出向导导出表结构,先保存到db.sql文件中吧。
可选步骤:安装Framework引导程序插件。
安装了这个插件你制作的安装包就通过 Microsoft Visual Studio .NET 2003 引导程序插件,您可以轻而易举地创建安装程序,将 .NET Framework 1.1随您的应用程序一起重新分发。
引导程序插件 PluginInstaller.msi 的下在地址:
http://www.microsoft.com/downloads/details.aspx?FamilyID=627921a0-d9e7-43d6-a293-72f9c370bd19&displaylang=zh-cn
第六步:添加db.sql以及你需要的其他文件到项目中,然后就可以打包了。
还 有最重要的一个问题,当时困扰了我三个多小时,就是用.net这个程序打包的程序,安装过程用户所选择的安装路径中是不能含有空格的。为什么呢?原来是 sql server的osql的执行命令行方式的时候,如果你的安装路径中含有空格的话,那个命令行是不能正确的执行的。“osql -U userId -P password -d dbname -i c:/test/db.sql”
另外安装的时候也可以直接修改安装后的app.config来完成你的配置,李洪根的文章中有相关介绍。
DBCustomAction.cs
using System;
using System.Data.SqlClient;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
namespace DBCustomAction
{
/// <summary>
/// DBCustomAction 的摘要说明。
/// </summary>
[RunInstaller(true)]
public class DBCustomAction : System.Configuration.Install.Installer
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public DBCustomAction()
{
// 该调用是设计器所必需的。
InitializeComponent();
// TODO: 在 InitializeComponent 调用后添加任何初始化
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
private void ExecuteSql(string connStr,string DatabaseName, string Sql)
{
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(Sql, conn);
conn.Open();
conn.ChangeDatabase(DatabaseName);
try
{
cmd.ExecuteNonQuery();
}
finally
{
conn.Close();
}
}
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
try
{
//------------------------建立数据库----------------------------
string connStr = string.Format("data source={0};user id={1};password={2};persist security info=false;packet size=4096", this.Context.Parameters["server"], this.Context.Parameters["user"], this.Context.Parameters["pwd"]);
ExecuteSql(connStr, "master", "CREATE DATABASE " + this.Context.Parameters["dbname"]);
System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process();
sqlProcess.StartInfo.FileName = "osql.exe";
sqlProcess.StartInfo.Arguments = string.Format(" -U {0} -P {1} -d {2} -i {3}db.sql", this.Context.Parameters["user"], this.Context.Parameters["pwd"], this.Context.Parameters["dbname"], this.Context.Parameters["targetdir"]);
sqlProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
sqlProcess.Start();
sqlProcess.WaitForExit(); //等待执行
}
catch(Exception e)
{
Console.Write(e.ToString());
}
finally
{
}
}
}
}
第六步:添加db.sql以及你需要的其他文件到项目中,然后就可以打包了。
还 有最重要的一个问题,当时困扰了我三个多小时,就是用.net这个程序打包的程序,安装过程用户所选择的安装路径中是不能含有空格的。为什么呢?原来是 sql server的osql的执行命令行方式的时候,如果你的安装路径中含有空格的话,那个命令行是不能正确的执行的。“osql -U userId -P password -d dbname -i c:/test/db.sql”
另外安装的时候也可以直接修改安装后的app.config来完成你的配置,李洪根的文章中有相关介绍。
DBCustomAction.cs
using System;
using System.Data.SqlClient;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
namespace DBCustomAction
{
/// <summary>
/// DBCustomAction 的摘要说明。
/// </summary>
[RunInstaller(true)]
public class DBCustomAction : System.Configuration.Install.Installer
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public DBCustomAction()
{
// 该调用是设计器所必需的。
InitializeComponent();
// TODO: 在 InitializeComponent 调用后添加任何初始化
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
private void ExecuteSql(string connStr,string DatabaseName, string Sql)
{
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(Sql, conn);
conn.Open();
conn.ChangeDatabase(DatabaseName);
try
{
cmd.ExecuteNonQuery();
}
finally
{
conn.Close();
}
}
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
try
{
//------------------------建立数据库----------------------------
string connStr = string.Format("data source={0};user id={1};password={2};persist security info=false;packet size=4096", this.Context.Parameters["server"], this.Context.Parameters["user"], this.Context.Parameters["pwd"]);
ExecuteSql(connStr, "master", "CREATE DATABASE " + this.Context.Parameters["dbname"]);
System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process();
sqlProcess.StartInfo.FileName = "osql.exe";
sqlProcess.StartInfo.Arguments = string.Format(" -U {0} -P {1} -d {2} -i {3}db.sql", this.Context.Parameters["user"], this.Context.Parameters["pwd"], this.Context.Parameters["dbname"], this.Context.Parameters["targetdir"]);
sqlProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
sqlProcess.Start();
sqlProcess.WaitForExit(); //等待执行
}
catch(Exception e)
{
Console.Write(e.ToString());
}
finally
{
}
}
}
}