【转】部署安装时写入SQL SERVER和Web.config

it2022-05-09  27

本文转自: http://aspxboy.com/private/5280/default.aspx 在.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 的摘要说明。 ///@ author:overred /// </summary> [RunInstaller(true)] public class DBCustomAction : System.Configuration.Install.Installer { /// <summary> /// 必需的设计器变量。 /// </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("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 } }

转载于:https://www.cnblogs.com/feima-lxl/archive/2008/03/13/1104033.html

相关资源:DirectX修复工具V4.0增强版

最新回复(0)