您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

部署安装时写入SQLSERVER和Web.config

2024/3/25 20:29:26发布18次查看
在.net平台下,部署 web 解决方案是比较方便的。我们可以利用visual studio.net 2003添加一个web安装项目,在部署的文件系统编辑器中添加项目的主输出和内容文件,非常简易地完成安装程序的制作。 但是,这样制作的安装程序,只是将web页和asp.net程序编译的
在.net平台下,部署 web 解决方案是比较方便的。我们可以利用visual studio.net 2003添加一个web安装项目,在部署的“文件系统编辑器”中添加项目的主输出和内容文件,非常简易地完成安装程序的制作。
但是,这样制作的安装程序,只是将web页和asp.net程序编译的dll文件安装到目标机器的iis目录,对于一般的应用程序是可以的(比如用access数据库,可以一起打包到安装程序中);如果数据库是sql server,需要在部署的时候一并安装数据库,安装程序的制作就会复杂一些,需要我们自定义安装程序类。在安装程序类中执行sql脚本并将连接字符串写入web.config。
l 安装数据库
微软msdn上介绍过在部署应用程序的时候建立数据库。如:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsintro7/html/vxwlkwalkthroughusingcustomactiontocreatedatabaseduringinstallation.asp
这种方法是创建一个安装程序类,在安装程序类中调用ado.net执行sql 语句(sql语句放在一个文本文件中)来创建数据库。
但是,这种方法有一个问题,如果用sql server2000生成了所有建表、视图、存储过程的一个脚本文件,用ado.net来执行这个脚本文件,就会因为脚本中有许多“go”语句而出现错误。当然,我们可以把“go”替换成换行符,利用ado.net一条条执行sql 语句。很显然,这样的效率比较低。
最好的办法是调用osql执行脚本。(或者创建一个数据库项目的cmd文件,而cmd文件建立数据库的时候也是调用的osql)。
using system;
using system.collections;
using system.componentmodel;
using system.configuration.install;
using system.data.sqlclient;
using system.io;
using system.reflection;
using system.diagnostics;
using system.xml;
namespace dbcustomaction
{
///
/// dbcustomaction 的摘要说明。
///
[runinstaller(true)]
public class dbcustomaction : system.configuration.install.installer
{
///
///@author:overred
///
private system.componentmodel.container components = null;
public dbcustomaction()
{
// 该调用是设计器所必需的。
initializecomponent();
// todo: 在 initializecomponent 调用后添加任何初始化
}
///
/// 清理所有正在使用的资源。
///
protected override void dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.dispose();
}
}
base.dispose( disposing );
}
#region 组件设计器生成的代码
///
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
///
private void initializecomponent()
{
components = new system.componentmodel.container();
}
#endregion
#region custom setup
private void executesql(string connstring,string databasename,string sql)
{
sqlconnection conn=new sqlconnection(connstring);
sqlcommand cmd=new sqlcommand(sql,conn);
conn.open();
cmd.connection.changedatabase(databasename);
try
{
cmd.executenonquery();
}
catch(exception e)
{
streamwriter w=new streamwriter(@e://log.txt,true);
w.writeline(===in executesql======);
w.writeline(e.tostring());
w.close();
}
finally
{
conn.close();
}
}
public override void install(idictionary statesaver)
{
createdb();
updateconfig();
}
private void createdb()
{
try
{
string connstring=string.format(server={0};user id={1};password={2},this.context.parameters[server],this.context.parameters[user],this.context.parameters[pwd]);
//根据输入的数据库名称建立数据库
executesql(connstring,master,create database this.context.parameters[dbname]);
//调用osql执行脚本
string cmd=string.format( -s{0} -u{1} -p{2} -d{3} -i{4}db.sql,this.context.parameters[server],this.context.parameters[user],this.context.parameters[pwd],this.context.parameters[dbname],this.context.parameters[targetdir]);
system.diagnostics.process sqlprocess=new process();
sqlprocess.startinfo.filename=osql.exe;
sqlprocess.startinfo.arguments=cmd;
sqlprocess.startinfo.windowstyle=processwindowstyle.hidden;
sqlprocess.start();
sqlprocess.waitforexit();//等待执行
sqlprocess.close();
//删除脚本文件
system.io.fileinfo sqlfileinfo=new fileinfo(string.format({0}db.sql,this.context.parameters[targetdir]));
if(sqlfileinfo.exists)
sqlfileinfo.delete();
}
catch(exception e)
{
streamwriter w=new streamwriter(@e:/log.txt,true);
w.writeline(===in install======);
w.writeline(e.tostring());
w.close();
}
}
private void updateconfig()
{
try
{
//将连接字符串写入web.config
system.io.fileinfo fileinfo=new fileinfo(string.format({0}web.config,this.context.parameters[targetdir]));
if(!fileinfo.exists)
throw new installexception(can't find the web.config);
xmldocument doc=new xmldocument();
doc.load(fileinfo.fullname);
bool foundit=false;
string connstring=string.format(server={0};database={1};user id={2};password={3},this.context.parameters[server],this.context.parameters[dbname],this.context.parameters[user],this.context.parameters[pwd]);
string encs=securityhelper.encryptdbconnectionstring(connstring);
xmlnode no=doc.selectsinglenode(//appsettings/add[@key='connstring']);
if(no!=null)
{
no.attributes.getnameditem(value).value=encs;
foundit=true;
}
if(!foundit)
throw new installexception(can't find the connstring setting );
doc.save(fileinfo.fullname);
}
catch(exception e)
{
streamwriter w=new streamwriter(@e:/log.txt,true);
w.writeline(===in updata connstring=tjtj=====);
w.writeline(e.tostring());
w.writeline(e.stacktrace);
w.close();
}
}
#endregion
}
}
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product