欢迎光临
我们一直在努力

部署安装时写入SQL SERVER和Web.config-.NET教程,数据库应用

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

在.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
{
/// <summary>
/// dbcustomaction 的摘要说明。
/// </summary>
[runinstaller(true)]
public class dbcustomaction : system.configuration.install.installer
{
/// <summary>
///@author:overred
/// </summary>
private system.componentmodel.container components = null;

public dbcustomaction()
{
// 该调用是设计器所必需的。
initializecomponent();

// todo: 在 initializecomponent 调用后添加任何初始化
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.dispose();
}
}
base.dispose( disposing );
}

#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 – 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
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(“cant 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(“cant 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
}
}

转自:动态网站制作指南 | www.knowsky.com
赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 部署安装时写入SQL SERVER和Web.config-.NET教程,数据库应用
分享到: 更多 (0)