vs打包安装时候附加数据库并修改配置文件及文件夹权限

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;

[RunInstaller(true)]
    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的博文




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值