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

在.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

}

}

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值