欢迎光临
我们一直在努力

部署安装时写入sql server和web.config_asp.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
}
}

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 部署安装时写入sql server和web.config_asp.net技巧
分享到: 更多 (0)