数据库安装包的制作

首先:新建一个类库,以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。这个细节我就不重复了。(注意一点,验证使用window集成)

切换到安装类到代码视图
引入名字空间:
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);
而不是MSDN的StreamReader 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的作用是指定myoamaster有db_owner的权限

PS:这几个sp的具体详细功能大家可以参考sql server的联机帮助。
完成了上面的东西后,万里长城就剩下一点点了。呵呵:)

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

然后编译执行。是不是很酷呢。呵呵

转载于:https://www.cnblogs.com/freetest/archive/2006/07/13/449778.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值