由于主要是参考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等其他一些大侠对我提供的帮助。再次感谢。使得我的项目顺利完成。
贴这些出来,希望对新手有用,至于高手,就随便看看好了。呵呵:)
