1.添加一个类库专门用于做此操作,然后添加一个“安装程序类”,此类继承于System.Configuration.Install.installer,
它的执行过程是在将输出内容解压后(web项目是将发布后的网站内容已经部署到了iis中了),
然后依次在此类中执行附加数据库操作,修改配置文件操作,修改文件夹操作:
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Configuration.Install;
using System.Linq;
using System.Collections.Specialized;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
using System.Xml;
using System.IO;
using System.Security.AccessControl;
using System.Diagnostics;
public partial class InstallDB : Installer
{
///<summary>
/// 必需的设计器变量,均来自于安装程序的“自定义操作”视图中的设置
///</summary>
//连接数据库的字符串XML文件的存储路径
string dbpath = string.Empty;
//数据库服务器名称
private string hostname;
//用户名
private string username;
//密码
private string userpassword;
public InstallDB()
{
InitializeComponent();
}
//重写安装程序的方法
public override void Install(IDictionary stateSaver)
{
try
{
base.Install(stateSaver);
string installPath = this.Context.Parameters["installdir"].ToString();
//得到需要添加用户权限的文件夹路径 zzpd权限zzpd权限修改
Execute("cacls", installPath + @"App_Data " + "/e /t /g \"NETWORK SERVICE\":f", "Y");
Execute("cacls", installPath + @"ZZPD\Excel /e /t /g Everyone:f", "Y");
Execute("cacls", installPath + @"ZZPD\Picture /e /t /g Everyone:f", "Y");
Execute("cacls", installPath + @"ZZPD\Resume /e /t /g Everyone:f", "Y");
Execute("cacls", installPath + @"ZZPD\DataAccess /e /t /g Everyone:f", "Y");
//zzpm权限修改
Execute("cacls", installPath + @"ZZPM\Excel /e /t /g Everyone:f", "Y");
Execute("cacls", installPath + @"ZZPM\Picture /e /t /g Everyone:f", "Y");
Execute("cacls", installPath + @"ZZPM\Resume /e /t /g Everyone:f", "Y");
Execute("cacls", installPath + @"ZZPM\DataExchage /e /t /g Everyone:f", "Y");
//zzpe权限修改,以后增加...
//获取数据库信息
hostname = Context.Parameters["hostname"].ToString();
username = Context.Parameters["username"].ToString();
userpassword = Context.Parameters["userpassword"].ToString();
//dbname = Context.Parameters["dbname"].ToString();
//附加数据库
//string chkzzpd = Context.Parameters["chkzzpd"].ToString();
string chkzzpm = Context.Parameters["chkzzpm"].ToString();
//string chkzzpe = Context.Parameters["chkzzpe"].ToString();
//更改配置文件的数据库连接
ModifyWebConfig();
//if (chkzzpd.Equals("1"))//职称评审被选中
//AppendDB("zzpd");
if (chkzzpm.Equals("1"))//项目经理被选中
AttachDatabase("zzpm");
else
{
throw new InstallException("必须选择安装系统!");
}
//if (chkzzpe.Equals("Checked"))
// AppendDB("zzpe");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//重写卸载程序的方法
public override void Uninstall(IDictionary stateSaver)
{
base.Uninstall(stateSaver);
//分离数据库
DetachDatabase();
}
//创建数据库连接,执行SQL语句
private bool ExecuteSql(string SqlStr, string connStr)
{
try
{
SqlConnection myConnection = new SqlConnection(connStr);
SqlCommand myCommand = new SqlCommand(SqlStr, myConnection);
myCommand.Connection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return false;
}
}
/// <summary>
/// 附加数据库
/// </summary>
/// <param name="database">数据库名称</param>
public void AttachDatabase(string database)
{
string dbaConnStr = string.Format("server={0};database=master;uid={1};pwd={2}", hostname, username, userpassword);
string dbConnStr = string.Format("server={0};database={1};uid={2};pwd={3}", hostname, database, username, userpassword);
string datafile = Context.Parameters["installdir"].ToString() + @"App_Data\" + database + ".mdf";
string logfile = Context.Parameters["installdir"].ToString() + @"App_Data\" + database + "_log.ldf";
string sqlStr = string.Format("EXEC sp_attach_db @dbname ='{0}',@filename1='{1}',@filename2='{2}'", database, datafile, logfile);
bool result = ExecuteSql(sqlStr, dbaConnStr);
//附加成功的话则修改配置文件以备卸载时分离数据库
if (result)
{
string dbConfigPath = this.Context.Parameters["installdir"].ToString() + @"\dbconfig.xml";
OperateXML.InsertDBLink(dbConfigPath, database, dbConnStr);
}
}
/// <summary>
/// 根据配置文件分离所有数据库
/// </summary>
public void DetachDatabase()
{
dbpath = Path.Combine(this.Context.Parameters["installdir"].ToString(), "dbconfig.xml");
Dictionary<string, string> dictDBLink = OperateXML.GetDBLink(dbpath, "DBLink");
if (dictDBLink.Count > 0)
{
foreach (KeyValuePair<string, string> dbLink in dictDBLink)
{
string dbaConnStr = dbLink.Value;
string sqlStr = string.Format("use master;EXEC sp_detach_db @dbname='{0}',@skipchecks='true'", dbLink.Key);
bool result = ExecuteSql(sqlStr, dbLink.Value);
}
}
}
//<summary>
//运行指定命令行,更改文件夹的权限
//</summary>
//<param name="cmd">命令</param>
//<param name="arg">命令行参数</param>
//<param name="comfirm">写入命令行的确认信息</param>
//<returns></returns>
private string Execute(string cmd, string arg, string comfirm)
{
Process p = new Process();
p.StartInfo.FileName = cmd;
p.StartInfo.Arguments = arg;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
if (comfirm != null)
{
p.StandardInput.WriteLine(comfirm);
}
string msg = p.StandardOutput.ReadToEnd();
p.WaitForExit();
p.Close();
return msg;
}
/// <summary>
/// 修改web.config文件中的数据库连接字符串
/// </summary>
private void ModifyWebConfig()
{
try
{
string XMLdir = Context.Parameters["installdir"] + @"Web.config";
XmlDocument doc = new XmlDocument();
doc.Load(XMLdir);
XmlNode root = doc.DocumentElement;
XmlNodeList xnl = root.ChildNodes;
foreach (XmlNode xnf in xnl)
{
if (xnf.Name == "connectionStrings")
{
//string chkzzpd = Context.Parameters["chkzzpd"].ToString();
string chkzzpm = Context.Parameters["chkzzpm"].ToString();
//string chkzzpe = Context.Parameters["chkzzpe"].ToString();
string strContent = string.Empty;
//if (chkzzpd.Equals("1"))
//strContent += "<add name=\"ZZPDConnectionString\" connectionString=\"server=" + hostname + ";database=zzpd;uid=" + username + ";pwd=" + userpassword + "\" providerName=\"System.Data.SqlClient\"/>";
if (chkzzpm.Equals("1"))
strContent += "<add name=\"ZZPMConnectionString\" connectionString=\"server=" + hostname + ";database=zzpm;uid=" + username + ";pwd=" + userpassword + "\" providerName=\"System.Data.SqlClient\"/>";
//if (chkzzpe.Equals("1"))
//strContent += "<add name=\"ZZPMConnectionString\" connectionString=\"server=" + hostname + ";database=zzpe;uid=" + username + ";pwd=" + userpassword + "\" providerName=\"System.Data.SqlClient\"/>";
xnf.InnerXml = strContent;
doc.Save(XMLdir);
break;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Windows.Forms;
using System.Collections.Specialized;
using System.Xml;
public class OperateXML
{
private static XmlDocument XmlDoc = new XmlDocument();
/// <summary>
/// 获取对应XML节点的值
/// </summary>
/// <param name="xml">Xml文件路径</param>
/// <param name="nodename">节点名</param>
/// <returns></returns>
public static string GetXmlNodeValue(string xmlPath, string nodeName)
{
string NodeValue = string.Empty;
try
{
XmlDoc.Load(xmlPath);
XmlNode root = XmlDoc.SelectSingleNode("root");
XmlNodeList xnl = root.ChildNodes;
foreach (XmlNode xnf in xnl)
{
XmlElement xe = (XmlElement)xnf;
if (xe.Name == nodeName)
{
NodeValue = xe.InnerText;
break;
}
}
}
catch
{
MessageBox.Show("XML文件格式错误");
}
return NodeValue;
}
/// <summary>
/// 增加xml节点
/// </summary>
/// <param name="xmlPath">xml文件路径</param>
/// <param name="nodeName">xml节点名</param>
/// <param name="nodeValue">xml节点值</param>
/// <returns></returns>
public static void InsertXMLNode(string xmlPath, string nodeName, string nodeValue)
{
try
{
//读入XML文件
XmlDoc.Load(xmlPath);
//建立一个节点。
XmlElement newNode = XmlDoc.CreateElement(nodeName);
newNode.InnerText = nodeValue;
//将节点“newNode”放在根节点下,并保存
XmlDoc.DocumentElement.AppendChild(newNode);
XmlDoc.Save(xmlPath);
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
调试过程中可用 MessageBox.Show("");检测调试。
这个类在编译过后需添加到setup项目中,可结合之前写过个一个websetup的博文