VS2005制作数据库安装包

没有图片的话,请看 本机目录 E:\Study\Books   这句话是写给自己看的

    由于主要是参考MSDN的,所以这里一些细节不再重复,具体大家可以参考MSDN上的Using a Custom Action to Create a Database During Installation一文。

下面开始说制作的步骤:

首先:新建一个类库,以C#为例。

然后添加新项,选择安装程序类。

接着添加一个名为:sql.txt的文件(注意大小写)点击sql.txt右键,在生成操作中选择嵌入的资源。

sql.txt的内容为从sql server数据库导出的sql语句

这里有个地方需要注意:

一般导出的sql格式是这样的:

CREATE TABLE [dbo].[Company_CanidateAlertList] (
[JobID] [int] NULL ,
[JobSeekerID] [int] NULL ,
[SYS_CreateTime] [datetime] NULL
) ON [PRIMARY]
GO

这时你需要改成:

CREATE TABLE [dbo].[Company_CanidateAlertList] (
[JobID] [int] NULL ,
[JobSeekerID] [int] NULL ,
[SYS_CreateTime] [datetime] NULL
) ON [PRIMARY];

否则不会被C# 执行,也不会报错。

  回到安装文件类的视图页面,点击数据库资源管理器,选择master数据库生成一个sqlconnection。这个细节我就不重复了。

切换到安装类到代码视图,引入名字空间:

using System.Reflection;
using System.IO;

然后添加以下几个函数,等下一一介绍:

private string GetSql(string Name)
{
try
{
Assembly Asm = Assembly.GetExecutingAssembly();
Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "."+Name);
StreamReader reader = new StreamReader(strm,System.Text.Encoding.Default);
//System.Text.Encoding.ASCII;
return reader.ReadToEnd();
}
catch (Exception ex)
{
Console.Write("In GetSql:"+ex.Message);
throw ex;
}
}

private void ExecuteSql(string DataBaseName,string Sql)
{
System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand(Sql,sqlConnection1);
Command.Connection.Open();
Command.Connection.ChangeDatabase(DataBaseName);
try
{
Command.ExecuteNonQuery();
}
finally
{
Command.Connection.Close();
}
}

protected void AddDBTable(string strDBName)
{
try
{
ExecuteSql("master","CREATE DATABASE "+ strDBName);
ExecuteSql(strDBName,GetSql("sql.txt"));
ExecuteSql("master","exec sp_addlogin 'myoamaster','myoamaster','"+strDBName+"',Null,Null");
ExecuteSql(strDBName,"EXEC sp_grantdbaccess 'myoamaster', 'myoamaster'");
ExecuteSql(strDBName,"exec sp_addrolemember 'db_owner','myoamaster'");
}
catch(Exception ex)
{
Console.Write("In exception handler :"+ex.Message);
}
}

public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
AddDBTable(this.Context.Parameters["dbname"]);
}

首先介绍GetSql函数:

他的作用是把sql.txt(作为参数)的sql语句一行一行读出来,但是要注意一点:

MSDN不同的,如果有中文的话,一定要加上:

StreamReader reader = new StreamReader(strm,System.Text.Encoding.Default);

而不是MSDNStreamReader reader = new StreamReader(strm);

否则中文全部是乱码:

ExecuteSql是一个通用函数,方便以后调用

程序的精髓在AddDBTable这个函数上面:

首先,

ExecuteSql("master","CREATE DATABASE "+ strDBName);

创建一个数据库,strDBName为传入参数。

ExecuteSql(strDBName,GetSql("sql.txt"));

调用GetSql函数,读sql.txt内容,并执行。

由于安装之后要与.NET系统融合,所以下面执行的sp是一个具体的情况。

首先,我的系统在web.config里使用的是mymoamaster用户,密码也为myoamaster,这样可以避免sa密码对于每个用户不同这个问题。

ExecuteSql("master","exec sp_addlogin 'myoamaster','myoamaster','"+strDBName+"',Null,Null"); 这个sp的主要作用是为新数据库创建一个登录

ExecuteSql(strDBName,"EXEC sp_grantdbaccess 'myoamaster', 'myoamaster'"); 这个语句的作用的为刚才这个登录指定数据库访问权限

ExecuteSql(strDBName,"exec sp_addrolemember 'db_owner','myoamaster'"); 这个sp的作用是指定myoamasterdb_owner的权限

完成了上面的东西后,就只差最后的步骤了。

  首先,添加一个新项目,选择应用程序文件夹,右键添加点击项目输出,选择主输出。右键安装项目,视图,用户界面,添加文本框A,作用是给你创建的数据库命名。对话框的文字随意,Edit1Porperty改成和MSDN上一样的CUSTOMTEXTA1
  然后把Edit2,3,4都隐藏掉。右键安装项目选择视图点击自定义操作 ,选中安装结点,单击添加双击应用程序文件夹在主输出来自...(活动)上右键属性CustomActiveData属性修改为/dbname=[CUSTOMTEXTA1](这个相信你也看出来了,在上面那几个函数里使用的strDBName就是这个了)。
  最后编译执行。

 

 

http://herald.seu.edu.cn/blog/snow/articles/44990.aspx
 
重点介绍如何在安装包中自动为客户创建数据库

步骤
1
、添加一个新项目->选择类库模板->命名为DBCustomAction 
2
、单击项目右键->添加新项->选择安装程序类(命名为DBCustomAction.cs) 
3
、在服务器资源管理器中添加->连接到数据库->指定用户密码(选择允许保存密码)->数据库选择master 
4
、切换到DBCustomAction.cs的视图状态->将服务器资源管理器数据库连接中的master.dbo拖动到designer

(第34点,可以不用管它,下面会从界面上设置数据库连接字符串)

5、添加一个新项sql.txt(注意要使用小写),输入下列sql代码 

 

sql.txt的内容为从sql server数据库导出的sql语句

这里有个地方需要注意:

一般导出的sql格式是这样的:

CREATE TABLE [dbo].[Company_CanidateAlertList] (

[JobID] [int] NULL ,

[JobSeekerID] [int] NULL ,

[SYS_CreateTime] [datetime] NULL

) ON [PRIMARY]

GO

这时你需要改成:

CREATE TABLE [dbo].[Company_CanidateAlertList] (

[JobID] [int] NULL ,

[JobSeekerID] [int] NULL ,

[SYS_CreateTime] [datetime] NULL

) ON [PRIMARY];

否则不会被C# 执行,也不会报错。

请注意:如果要Insert数据的话,千万要考虑 各个表之间关联,自增列等细节问题。

 

6、在sql.txt的右键属性中->生成操作->嵌入的资源 
7
、将DBCustomAction.cs切换到代码视图,添加下列代码 
        private string GetSql(string Name)

        {

            try

            {

                Assembly Asm = Assembly.GetExecutingAssembly();

                Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + Name);

                StreamReader reader = new StreamReader(strm,System.Text.Encoding.Default);

                return reader.ReadToEnd();

            }

            catch (Exception ex)

            {

                Console.Write("In GetSql:" + ex.Message);

                throw ex;

            }

        }

 

        private void ExecuteSql(string DataBaseName, string Sql,string strSqlConn)

        {

            System.Data.SqlClient.SqlConnection sqlConnection1 = new System.Data.SqlClient.SqlConnection(strSqlConn);

            System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand(Sql, sqlConnection1);

 

            Command.Connection.Open();

            Command.Connection.ChangeDatabase(DataBaseName);

            try

            {

                Command.ExecuteNonQuery();

            }

            finally

            {

                Command.Connection.Close();

            }

        }

 

        protected void AddDBTable(string strDBName,string strDataSource,string strUser,string strPassWord)

        {

            try

            {

                string strSqlConn = "data source=" + strDataSource + ";user=" + strUser + ";password=" + strPassWord

                    + ";initial catalog=master;Persist Security Info=;";

 

                ExecuteSql("master", "CREATE DATABASE " + strDBName, strSqlConn);

                ExecuteSql(strDBName, GetSql("sql.txt"), strSqlConn);

            }

            catch (Exception ex)

            {

                Console.Write("In exception handler :" + ex.Message);

            }

        }

 

        public override void Install(System.Collections.IDictionary stateSaver)

        {

            base.Install(stateSaver);

            AddDBTable(this.Context.Parameters["dbname"], this.Context.Parameters["datasource"]

                , this.Context.Parameters["user"], this.Context.Parameters["password"]);

        }
8、再添加一个新项目,(选择添加到解决方案中)->项目类型为安装项目->命名为DBCustomAction Installer 
9
、选择应用程序文件夹->添加->项目输出->主输出 
10
、在方案资源管理器中->右键安装项目(DBCustomAction Installer)->视图->用户界面 
11
、选中启动结点->添加对话框->文本
12
、选动文本框A->右键->上移一直到最顶端 
13
、选择文本框A属性->修改BannerText,(Specify Database Name) 
14
、修改BodyText(This dialog allows you to  specify the name of the database to be created on the database server. ) 
15
、修改EditLabel1(Name of DB),修改Edit1Porperty(CUSTOMTEXTA1),将其他Edit2,3,4Edit(2,3,4)Visible属性设为false; 

(13,14,15点请如下图设置,这样可以多设置几个输入参数框,以符合设置要求)


16
、在方案资源管理器中->右键安装项目(DBCustomAction Installer)->视图->自定义操作 
17
、选中安装结点->添加->双击应用程序文件夹->主输出来自DBCustomAction(活动)->右键属性->CustomActiveData属性修改为/dbname=[CUSTOMTEXTA1] 

17点请如下图操作,设置多个参数。例如图中:“/dbname=[CUSTOMTEXTA1] /datasource=[SERVERIP] /user=[USERNAME] /password=[PASSWORD]”每个/之前要用空格隔开,否则程序不报错,也不会正确执行。)


18
、编译生成,OK! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值