随笔 - 53  文章 - 0  评论 - 908 

上一节是讲述如何制作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添加到项目中,如下图:

image

右击createdatabase.sql查看属性,如下图:

image

设置生成操作为嵌入的资源。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包打包进安装项目。

image

我们执行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包了。

 

本节完。

 

下载示例

 


作者:steven hu
出处:http://www.cnblogs.com/huxj
MSN: cn_huxj@hotmail.com
交流QQ群:60831381
版权声明:欢迎任何网络媒体和网站转载本人博客的内容,只需注明作者和主博客文章地址的链接。另有约定者除外。
此声明随时可能修改,不另行通知。
评论快速通道:
posted on 2010-09-12 16:26 steven hu 阅读(3512) 评论(29) 编辑 收藏

 回复 引用 查看   
#1楼 2010-09-12 18:55 | ffffff      
好文要顶,推荐一下!
 回复 引用 查看   
#2楼 2010-09-12 20:43 | 秋色      
好文要顶,推荐一下!
 回复 引用 查看   
#3楼 2010-09-12 20:45 | 二哥      
好文要顶,推荐一下!
 回复 引用 查看   
#4楼 2010-09-12 20:53 | 秋色      
好文要顶,推荐一下!
 回复 引用 查看   
#5楼 2010-09-12 23:14 | 斯克迪亚      
好文要顶,推荐一下!
 回复 引用 查看   
#6楼 2010-09-13 00:41 | Jeffrey.Liang      
朋友,我用你的安装程序安装的时候能正常安装数据库。
但我按照你的做法去安装的时候,
catch (Exception ex)
{
MessageBox.Show("数据库安装失败!\n数据库配置有误,请正确配置信息!\n" + ex.Message, "出错啦!");
this.Rollback(stateSaver);
}这段代码会报"在sysdatabases中找不到数据库'System'所对应条目。没有找到具有该名称的条目。请确保正确输入了该名称。"
这是我的代码:http://files.cnblogs.com/Jeffreyliang/WebApplicationSetup.rar
麻烦你帮我看看,我一直没搞懂是什么造成的。
谢谢了。对了,这是VS2008创建的项目


 回复 引用 查看   
#7楼[楼主] 2010-09-13 08:38 | steven hu      
@Jeffrey.Liang
您的createdatabase.sql脚本有错误啊,数据库名还没有修改过。

 回复 引用 查看   
#8楼 2010-09-13 09:17 | seraphi      
好文要顶,推荐一下!
 回复 引用 查看   
#9楼 2010-09-13 09:43 | ★星星☆      
好文要顶,推荐一下!
 回复 引用 查看   
#10楼 2010-09-13 09:49 | Jeffrey.Liang      
引用steven hu:
@Jeffrey.Liang
您的createdatabase.sql脚本有错误啊,数据库名还没有修改过。

兄弟,具体是那个语句数据库名还没有修改过啊?我记得我把数据库名都改成DemoDB了

 回复 引用 查看   
#11楼[楼主] 2010-09-13 09:53 | steven hu      
@Jeffrey.Liang
把HxjDB全部替换成DemoDB,再试试

 回复 引用 查看   
#12楼 2010-09-13 10:08 | Jeffrey.Liang      
引用steven hu:
@Jeffrey.Liang
把HxjDB全部替换成DemoDB,再试试



我把整个解决方案里的HxjDB全部替换成了DemoDB,还是出现同样的问题。朋友,要不,你在你那里试试我的这个程序,看是否会出现这个问题。谢谢了

这个是好文章,推荐+1
 回复 引用 查看   
#14楼[楼主] 2010-09-13 10:31 | steven hu      
@Jeffrey.Liang
读取资源文件的地方,reader.ToString();改为reader.ReadToEnd();

 回复 引用 查看   
#15楼 2010-09-13 10:40 | Jeffrey.Liang      
终于解决了。朋友,谢谢你的帮助。
 回复 引用 查看   
#16楼 2010-09-13 10:55 | Cool it      
好文要顶,推荐一下!
 回复 引用 查看   
#17楼 2010-09-13 11:10 | 凤凰涅磐_SHUn      
好文要顶,推荐一下!
 回复 引用 查看   
#18楼 2010-09-13 12:21 | 迭_戈      
好文要顶,推荐一下!
 回复 引用 查看   
#19楼 2010-09-13 12:38 | 爱上北溟鸟      
好文要顶,推荐一下!
 回复 引用 查看   
#20楼 2010-09-13 13:29 | tim song      
好文要顶,推荐一下!
 回复 引用 查看   
#21楼 2010-09-13 13:29 | tim song      
路过,凑个热闹^_^
 回复 引用 查看   
#22楼 2010-09-13 13:31 | 活雷锋      
支持下 steven 的好文~
 回复 引用 查看   
#23楼 2010-09-13 14:11 | ffffff      
支持!
 回复 引用 查看   
#24楼 2010-09-13 15:19 | Kinglee      
好文要顶,推荐一下!
 回复 引用 查看   
#25楼[楼主] 2010-09-13 21:20 | steven hu      
谢谢大家的支持!
 回复 引用 查看   
#26楼 2010-09-14 23:33 | 三桂      
好文要顶,推荐一下!
 回复 引用 查看   
#27楼 2010-09-15 16:55 | 一过      
顶一顶
 回复 引用 查看   
#28楼 2010-09-15 16:55 | 一过      
好文要顶,推荐一下!
 回复 引用 查看   
#29楼 2011-12-21 16:59 | wangcheng      
当我继承了, System.Configuration.Install.Installer基类后,重写了OnBeforeInstall方法,方法中执行了其他程序的安装,如下所示

protected override void OnBeforeInstall(IDictionary savedState)
{
base.OnBeforeInstall(savedState);
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的安装界面可以出来,但提示有一个安装程序正在运行。导致安装失败,比如说我以后还有其他的组件。有没有什么办法可以让相关程序一个接着一个安装。谢谢。