欢迎光临
我们一直在努力

建站超值云服务器,限时71元/月

由于主要是参考msdn的,所以这里一些细节不再重复
具体大家可以参考msdn上一篇叫:
walkthrough: 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。这个细节我就不重复了。(注意一点,验证使用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就是这个了。呵呵

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

ps:好久没有写过东西了,写得不好,希望大家不要介意。有什么疑问或者可以改进的地方希望大家提出。
特别感谢:zee,cnet,amjn等其他一些大侠对我提供的帮助。再次感谢。使得我的项目顺利完成。

贴这些出来,希望对新手有用,至于高手,就随便看看好了。呵呵:)

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 »
分享到: 更多 (0)

相关推荐

  • 暂无文章