本文共 4418 字,大约阅读时间需要 14 分钟。
在.NET平台下,部署 Web 解决方案是比较方便的。我们可以利用Visual Studio.NET 2003添加一个WEB安装项目,在部署的“文件系统编辑器”中添加项目的主输出和内容文件,非常简易地完成安装程序的制作。 但是,这样制作的安装程序,只是将Web页和ASP.NET程序编译的DLL文件安装到目标机器的IIS目录,对于一般的应用程序是可以的(比如用Access数据库,可以一起打包到安装程序中);如果数据库是SQL SERVER,需要在部署的时候一并安装数据库,安装程序的制作就会复杂一些,需要我们自定义安装程序类。在安装程序类中执行SQL脚本并将连接字符串写入Web.config。 微软MSDN上介绍过在部署应用程序的时候建立数据库。如: 这种方法是创建一个安装程序类,在安装程序类中调用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> /// </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 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(); } } 本文转自周金桥51CTO博客,原文链接: http://blog.51cto.com/zhoufoxcn/166971 ,如需转载请自行联系原作者