上一节是讲述如何制作Web安装包 的过程,只要按照步骤做就可以了。这一节将讲述安装过程中如何部署数据库,以及执行其他组件的安装。
在这里使用直接执行sql脚本来创建数据库。(也可以使用附件数据库文件的形式)只要在Install方法中添加执行sql脚本的方法,就是使用SqlConnection连接数据库操作。
using
(SqlConnectionconnection
=
newSqlConnection(connectionString))
{
connection.Open();
ExecuteSQL(connection, GetResource(
"
createdatabase.sql
"
));
}
///
<summary>
///
执行sql语句
///
</summary>
///
<param name="connection"></param>
///
<param name="sql"></param>
void
ExecuteSQL(SqlConnection connection,
string
sql)
{
SqlCommand cmd
=
new
SqlCommand(sql, connection);
cmd.ExecuteNonQuery();
}
///
<summary>
///
获取数据库登录连接字符串
///
</summary>
///
<param name="databasename">
数据库名称
</param>
///
<returns></returns>
private
string
GetConnectionString(
string
databasename)
{
return
"
server=
"
+
Context.Parameters[
"
server
"
].ToString()
+
"
;database=
"
+
(
string
.IsNullOrEmpty(databasename)
?
"
master
"
: databasename)
+
"
;User ID=
"
+
Context.Parameters[
"
user
"
].ToString()
+
"
;Password=
"
+
Context.Parameters[
"
pwd
"
].ToString();
}
在这里使用嵌入式资源的形式打包sql脚本。我们添加createdatabase.sql和dropdatabase.sql添加到项目中,如下图:
右击createdatabase.sql查看属性,如下图:
设置生成操作为嵌入的资源。dropdatabase.sql也是如此操作。下面我们来使用代码如何读取资源的脚本,就是上面代码中的GetResource方法。
/// <summary>
///
获取资源文件中的脚本
/// </summary>
/// <param name="resourceName"></param>
/// <returns></returns>
string
GetResource(string
resourceName)
{
Assembly
ass = Assembly
.GetExecutingAssembly();
using
(Stream
stream = ass.GetManifestResourceStream(ass.GetName().Name + "."
+ resourceName))
{
using
(StreamReader
reader = new
StreamReader
(stream, System.Text.Encoding
.Default))
{
return
reader.ReadToEnd();
}
}
}
这样再来看install方法的全部代码,如下:
/// <summary>
///
安装
/// </summary>
/// <param name="stateSaver"></param>
public override void
Install(IDictionary
stateSaver)
{
base
.Install(stateSaver);
string
connectionString = GetConnectionString(null
);
try
{
using
(SqlConnection
connection = new
SqlConnection
(connectionString))
{
connection.Open();
ExecuteSQL(connection, GetResource("createdatabase.sql"
));
}
}
catch
(Exception
ex)
{
MessageBox
.Show("数据库安装失败!/n数据库配置有误,请正确配置信息!/n"
+ ex.Message, "出错啦!"
);
this
.Rollback(stateSaver);
}
}
这样就完成了安装中数据库的创建。在卸载中删除数据库则需要重写Uninstall方法,来执行dropdatabase.sql中的脚本。
/// <summary>
///
卸载
/// </summary>
/// <param name="savedState"></param>
public override void
Uninstall(IDictionary
savedState)
{
base
.Uninstall(savedState);
/*
//这里要获取保存的链接字符串
string connectionString =
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
ExecuteSQL(connection, GetResource("dropdatabase.sql"));
}
}
catch (Exception ex)
{
MessageBox.Show("数据库卸载失败!/n数据库配置有误,请正确配置信息!/n" + ex.Message, "出错啦!");
}
*/
}
创建表、创建示例数据的操作就是类似操作,就是打包新的资源。Web项目的数据库连接都是在Web.config中的,所以安装过程还要修改Web.config的数据库连接,这里使用简单的替换。如下:
/*
* 设置webconfig连接字符串
*/
string
webconfigpath = Path
.Combine(this
.Context.Parameters["targetdir"
].ToString(), "web.config"
);
string
webcofnigstring = File
.ReadAllText(webconfigpath).Replace("#constring#"
, GetConnectionString("hxjdatabasename"
));
File
.WriteAllText(webconfigpath, webcofnigstring);
Web 项目中WebConfig中配置:
<
add
name
=
"ConnectionString
" connectionString
=
"#constring#
" providerName
=
"System.Data.SqlClient
" />
就是替换#constring#为安装过程中生成的新的链接字符串。还有在我们的OA项目中还是用微软的AJAX库,所以还要安装Ajax包。我们将AJAX包打包进安装项目。
我们执行ajax 2.0.msi的代码,如下:
/*
* 安装ajax2.0框架
*/
System.Diagnostics.Process
process = new
System.Diagnostics.Process
();
process.StartInfo.FileName = Path
.Combine(this
.Context.Parameters["targetdir"
].ToString(), "Ajax 2.0.msi"
);
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle
.Hidden;
process.Start();
process.WaitForExit();
这样在安装过称中就会安装这个ajax包了。