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

这一节只是补充说明一下。

一、 安装标题

按照前面的做法中,在安装过程中,如下图

image

安装的标题是HxjWebSteup,这样的标题和产品名称显然是无法再实际项目中使用的。

这里我们需要通过设置安装项目的属性来设置一下就可以,选中HxjWebSetup项目按F4出来属性窗口,这个和右击项目属性是不一样的。如下图:

image

我们修改一下ProductName这个属性,变成Steven hu ProductName

我们再来看看安装过程,如下图:

image

我们想要的效果已经达到了,安装标题和产品名称都已经修改。

 

二、附加数据库

在第二节中有提到可以使用直接附加数据库文件的形式来完成我们项目数据库的创建安装。

其实我们平时经常使用企业管理器来附加数据库,当然我们也可以执行数据库的系统存储过程来完成该项操作。

sp_attach_db 存储过称,我们首先来看一下帮助文档中解释;

sp_attach_db

将数据库附加到服务器。

语法

sp_attach_db [ @dbname = ] 'dbname' 

, [ @filename1 = ] 'filename_n' [ ,...16 ]

 

 

参数

[@dbname =] 'dbname'

要附加到服务器的数据库的名称。该名称必须是唯一的。dbname 的数据类型为 sysname,默认值为 NULL。

[@filename1 =] 'filename_n'

数据库文件的物理名称,包括路径。filename_n 的数据类型为 nvarchar(260),默认值为 NULL。最多可以指定 16 个文件名。参数名称以 @filename1 开始,递增到 @filename16。文件名列表至少必须包括主文件,主文件包含指向数据库中其它文件的系统表。该列表还必须包括数据库分离后所有被移动的文件。

 

下面我们来具体实现一下,

首先将数据库文件放到web项目app_data文件夹下,如下图:

image

接下来,修改安装类中的代码,如下:

/// <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();

            string sql = "sp_attach_db 'HxjDB','" + Context.Parameters["targetdir"].ToString() + "App_Data/HxjDB_Data.MDF','"
                + Context.Parameters["targetdir"].ToString() + "App_Data/HxjDB_Log.LDF'";                    
            
            ExecuteSQL(connection, sql);

            //ExecuteSQL(connection, GetResource("createdatabase.sql"));

        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("数据库安装失败!\n数据库配置有误,请正确配置信息!\n" + ex.Message, "出错啦!");

        this.Rollback(stateSaver);
    }
}

其他没有改变,然后就重新打包。

然后安装,在web项目下的数据库就会被附加上去。

 

三、卸载

在示例中的做法在安装的时候是没有问题的,在卸载或者修复的时候,

/// <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();
}

这里是无法获取正确的链接字符串,Context.Parameters["server"] 这些都已经不存在了,所以要想在卸载和修复的时候都可以用,则需要在安装的时候保存连接字符串。

保存的位置和方式可根据自己的喜好存储,毕竟连接字符串不是机密,自己方便自己就好了。

要想卸载的时候执行UnInstall方法,需要在安装项目中自定义操作中的卸载添加HxjDBInstall。如下图:

image

 

本节完。

 


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

 回复 引用 查看   
#1楼 2010-09-16 20:06 | 迭_戈      
有空试试
 回复 引用 查看   
#2楼 2010-09-16 20:39 | 罩哥      
好文要顶,推荐一下!
非常好文章,推荐+1
我很少收藏文章,你这个我收藏了。

 回复 引用 查看   
#5楼 2010-09-17 08:13 | 东方游人      
呵呵,03年的做过呢
 回复 引用 查看   
#6楼 2010-09-17 09:30 | Cool it      
好文要顶,推荐一下!
 回复 引用 查看   
#7楼 2010-09-17 10:56 | 简单才能永恒      
我在win7用VS2008做出来的安装包在win7不能安装,在XP下可以呢?咋回事?
 回复 引用 查看   
#8楼[楼主] 2010-09-17 11:06 | steven hu      
谢谢大家的支持。

@简单才能永恒
我的问题和你一样,我是vista用vs2008做出来的安装包自己的vista下不能用。

具体为什么我也不清楚。


 回复 引用 查看   
#9楼 2010-09-17 11:35 | cisco      
好文要顶,推荐一下!
 回复 引用 查看   
#10楼 2010-09-17 13:15 | ℡.^傻僤      
好文要顶,推荐一下!
 回复 引用 查看   
#11楼 2010-09-17 15:20 | HeroBeast      
路过,凑个热闹^_^
 回复 引用 查看   
#12楼 2010-09-17 23:12 | Jeffrey.Liang      
已收录到移动硬盘中!!!
 回复 引用 查看   
#13楼 2010-09-26 08:45 | 做饭不洗碗      
好文要顶,推荐一下!
 回复 引用 查看   
#14楼 2010-10-08 16:58 | peace      
好文要顶,推荐一下!
 回复 引用 查看   
#15楼 2010-10-17 00:21 | 程序员2      
好文要顶,推荐一下!
 回复 引用 查看   
#16楼 2011-01-06 10:59 | J.kinbor      
好文要顶,推荐一下!
 回复 引用 查看   
#17楼 2011-06-14 22:07 | Macheal.Lee      
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 Microwind.Cashbox.CashboxInstaller.CBInstaller.Install(IDictionary stateSaver)

 回复 引用 查看   
#18楼[楼主] 2011-06-15 20:41 | steven hu      
@Macheal.Lee
不太明白你的错误……