Newer
Older
GHFX_REFACTOR / FrmDbManager.cs
wxn on 2 Nov 2016 16 KB 提交
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using System.Text.RegularExpressions;
using System.Xml;
using System.IO;

namespace Cyberpipe
{
    public partial class FrmDbManager : Office2007Form
    {
        private List<databaseClass> dblist = null;
        private string[] dbnames = null;
        private Boolean addStatus = false;
        private Boolean editStatus = false;
        private string strFileName = Application.StartupPath + "/databaseConfig.xml";
             
        public FrmDbManager()
        {
            InitializeComponent();
        }
        //初始化加载所有数据库列表
        private void FrmDbManager_Load(object sender, EventArgs e)
        {
            dblist = readXML(); 
            dbnames=new string[dblist.Count];
            for (int i = 0; i < dblist.Count; i++)
            {
                dbLists.Items.Add(dblist[i].title);
                dbnames[i] = dblist[i].title;
            } 
        }
        /// <summary>
        /// 读取xml文件
        /// </summary>
        public List<databaseClass> readXML()
        { 
            List<databaseClass> listDb = new List<databaseClass>();
            if (File.Exists(strFileName))
            {
                try
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(strFileName);

                    XmlNode xn = doc.SelectSingleNode("Database");
                    // 得到根节点的所有子节点
                    XmlNodeList xnl = xn.ChildNodes;
                    foreach (XmlNode xn1 in xnl)
                    {
                        databaseClass model = new databaseClass();
                        XmlElement xe = (XmlElement)xn1;// 将节点转换为元素,便于得到节点的属性值
                        model.title = xe.GetAttribute("title");
                        // 得到database节点的所有子节点
                        XmlNodeList xnl0 = xe.ChildNodes;
                        model.dbip = xnl0.Item(0).InnerText;
                        model.database = xnl0.Item(1).InnerText;
                        model.dbuser = xnl0.Item(2).InnerText;
                        model.dbpassword = xnl0.Item(3).InnerText;

                        listDb.Add(model);
                    }
                }
                catch (Exception ex)
                { 
                }
            }
            return listDb;
        }
        /// <summary>
        /// 新建数据库连接
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX2_Click(object sender, EventArgs e)
        {

            dbTxt.Text = "";
            dbIpTxt.Text = "";
            dbNmTxt.Text = "";
            dbUserTxt.Text = "";
            dbUsrPwdTxt.Text = "";

            dbTxt.Enabled = true;
            dbIpTxt.Enabled = true;
            dbNmTxt.Enabled = true;
            dbUserTxt.Enabled = true;
            dbUsrPwdTxt.Enabled = true;

            btnAdd.Enabled = false;
            btnEdit.Enabled = false;
            btnSave.Enabled = true;
            btnDelete.Enabled = false;
            addStatus = true;
            editStatus = false;
        } 
        /// <summary>
        /// 点击数据库,查询基本配置
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dbLists_SelectedIndexChanged(object sender, EventArgs e)
        {
            //MessageBox.Show(dbLists.SelectedItem.ToString());
            string selectedDbname=dbLists.SelectedItem.ToString();
            //根据库名查找对应的数据库配置
            for (int i = 0; i < Utility.listDb.Count; i++) {
                if (selectedDbname == dblist[i].title)
                {
                    dbTxt.Text = dblist[i].title;
                    dbIpTxt.Text = dblist[i].dbip;
                    dbNmTxt.Text = dblist[i].database;
                    dbUserTxt.Text = dblist[i].dbuser;
                    dbUsrPwdTxt.Text = dblist[i].dbpassword;
                }
                else {
                    continue;
                }
            }
        }
        /// <summary>
        /// 编辑操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnEdit_Click(object sender, EventArgs e)
        {
            //dbTxt.Enabled = true;
            dbIpTxt.Enabled = true;
            dbNmTxt.Enabled = true;
            dbUserTxt.Enabled = true;
            dbUsrPwdTxt.Enabled = true;

            btnSave.Enabled = true;
            btnEdit.Enabled = false;
            editStatus = true;
        }
         
        /// <summary>
        /// 删除某个数据库配置
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDelete_Click(object sender, EventArgs e)
        { 
            if (dbLists.SelectedIndex > 0)
            {
                deleteXMLNode(strFileName,dbLists.SelectedItem.ToString().Trim());
                ReLoadDatabaseList();
            }
            else {
                MessageBox.Show("请选择一个要删除的数据库连接");
                return;
            }
            MessageBox.Show("删除成功");
            //重载list表
            dblist = readXML();
            dbLists.Items.Clear();
            for (int i = 0; i < dblist.Count; i++)
            {
                dbLists.Items.Add(dblist[i].title);
            }
            dbTxt.Text = "";
            dbIpTxt.Text = "";
            dbNmTxt.Text = "";
            dbUserTxt.Text = "";
            dbUsrPwdTxt.Text = "";
        }
        /// <summary>
        /// 编辑后保存
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSave_Click(object sender, EventArgs e)
        {
            if (editStatus)
            {
                //验证数据库配置是否正确 
                //ip为*.*.*.*的格式
                if (!IPCheck(dbIpTxt.Text))
                {
                    MessageBox.Show("请输入正确的ip地址");
                    return;
                }
                //数据库名
                //if (!IsLetter(dbNmTxt.Text))
                //{
                //    MessageBox.Show("数据库名称应该为英文");
                //    return;
                //}
                //用户名
                if (IsChinese(dbUserTxt.Text))
                {
                    MessageBox.Show("用户名应该为英文或数字");
                    return;
                }
                //密码
                if (IsChinese(dbUsrPwdTxt.Text))
                {
                    MessageBox.Show("密码应该为英文或数字");
                    return;
                }
                //修改已有的databaseConfig.xml文件的一个节点  
                modifyXMLNode(strFileName, dbTxt.Text, dbIpTxt.Text, dbNmTxt.Text,
                    dbUserTxt.Text, dbUsrPwdTxt.Text); 
                MessageBox.Show("保存成功"); 

                btnAdd.Enabled = true;
                btnEdit.Enabled = true;
                btnSave.Enabled = false;
                btnDelete.Enabled = true;

                addStatus = false;
                editStatus = false; 
            }
            if (addStatus)
            {
                //验证数据库配置是否正确
                //db为中文
                //if (!IsChinese(dbTxt.Text.Trim()))
                //{ 
                //    MessageBox.Show("请输入正确的数据库标识名称");
                //    return;
                //}
                //ip为*.*.*.*的格式
                if (!IPCheck(dbIpTxt.Text))
                {
                    MessageBox.Show("请输入正确的ip地址");
                    return;
                }
                //数据库名
                //if (!IsLetter(dbNmTxt.Text)) {
                //    MessageBox.Show("数据库名称应该为英文");
                //    return;
                //}
                //用户名
                if (IsChinese(dbUserTxt.Text))
                {
                    MessageBox.Show("用户名应该为英文或数字");
                    return;
                }
                //密码
                if (IsChinese(dbUsrPwdTxt.Text))
                {
                    MessageBox.Show("密码应该为英文或数字");
                    return;
                }
                //编辑已有的databaseConfig.xml文件  
                if (insertXMLNode(strFileName,dbTxt.Text,dbIpTxt.Text,dbNmTxt.Text,
                    dbUserTxt.Text,dbUsrPwdTxt.Text)) {
                        MessageBox.Show("保存成功");
                }

                btnAdd.Enabled = true;
                btnEdit.Enabled = true;
                btnSave.Enabled = false;
                btnDelete.Enabled = true;

                addStatus = false;
                editStatus = false;
            }

            dbTxt.Enabled = false;
            dbIpTxt.Enabled = false;
            dbNmTxt.Enabled = false;
            dbUserTxt.Enabled = false;
            dbUsrPwdTxt.Enabled = false;
             
            dblist = readXML();
            dbLists.Items.Clear();
            for (int i = 0; i < dblist.Count; i++)
            {
                dbLists.Items.Add(dblist[i].title); 
            }

            ReLoadDatabaseList();
        } 
        /// <summary>
        /// 向xml文件中插入节点
        /// </summary>
        /// <param name="db"></param>
        /// <param name="dbip"></param>
        /// <param name="dbname"></param>
        /// <param name="dbuser"></param>
        /// <param name="dbpwd"></param>
        public Boolean insertXMLNode(string strFileName,string db, string dbip, string dbname, string dbuser, string dbpwd)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(strFileName);
            XmlNode root = xmlDoc.SelectSingleNode("Database");//查找<Database>   
            XmlElement xe1 = xmlDoc.CreateElement("dbc");//创建一个<dbc>节点   
            xe1.SetAttribute("title", db);//设置该节点title属性 

            XmlElement xesub1 = xmlDoc.CreateElement("dbip");
            xesub1.InnerText = dbip;//设置文本节点   
            xe1.AppendChild(xesub1);//添加到<dbc>节点中   
            XmlElement xesub2 = xmlDoc.CreateElement("dbname");
            xesub2.InnerText = dbname;
            xe1.AppendChild(xesub2);
            XmlElement xesub3 = xmlDoc.CreateElement("dbuser");
            xesub3.InnerText = dbuser;
            xe1.AppendChild(xesub3);
            XmlElement xesub4 = xmlDoc.CreateElement("dbpassword");
            xesub4.InnerText = dbpwd;
            xe1.AppendChild(xesub4);

            root.AppendChild(xe1);//添加到<Database>节点中   
            xmlDoc.Save(strFileName);
            return true;
        }
        /// <summary>
        /// 向xml文件中插入节点
        /// </summary>
        /// <param name="db"></param>
        /// <param name="dbip"></param>
        /// <param name="dbname"></param>
        /// <param name="dbuser"></param>
        /// <param name="dbpwd"></param>
        public void modifyXMLNode(string strFileName, string title,string dbip, string dbname, string dbuser, string dbpwd)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(strFileName);

            XmlNodeList nodeList = xmlDoc.SelectSingleNode("Database").ChildNodes;//获取bookstore节点的所有子节点   
            foreach (XmlNode xn in nodeList)//遍历所有子节点   
            {
                XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型   
                if (xe.GetAttribute("title") == title)//如果title属性值为要修改的   
                {
                    xe.SetAttribute("title", title);//则修改该属性为“”   

                    XmlNodeList nls = xe.ChildNodes;//继续获取xe子节点的所有子节点   

                    foreach (XmlNode xn1 in nls)//遍历   
                    {  
                        XmlElement xe1 = (XmlElement)xn1;//转换类型   
                        if (xe1.Name == "dbip")//如果找到   
                        {
                            xe1.InnerText = dbip;//则修改    
                        }
                    }
                    foreach(XmlNode xn1 in nls){
                        XmlElement xe2 = (XmlElement)xn1;
                        if (xe2.Name == "dbname")
                        {
                            xe2.InnerText = dbname;//则修改   
                        }
                    }
                    foreach(XmlNode xn1 in nls){
                        XmlElement xe3 = (XmlElement)xn1;
                        if (xe3.Name == "dbuser")
                        {
                            xe3.InnerText = dbuser;//则修改 
                        }
                    }
                    foreach(XmlNode xn1 in nls){
                        XmlElement xe4 = (XmlElement)xn1;
                        if (xe4.Name == "dbpassword")
                        {
                            xe4.InnerText = dbpwd;//则修改    
                        }
                    }
                    break;
                }
            }

            xmlDoc.Save(strFileName);//保存。   
        }
        /// <summary>
        /// 删除xml文件中的某个节点
        /// </summary>
        /// <param name="strFileName"></param>
        /// <param name="db"></param>
        public void deleteXMLNode(string strFileName,string db) {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(strFileName);

            XmlNodeList xnl = xmlDoc.SelectSingleNode("Database").ChildNodes;

            foreach (XmlNode xn in xnl)
            {
                XmlElement xe = (XmlElement)xn;
                if (xe.GetAttribute("title") ==db)
                { 
                    xn.ParentNode.RemoveChild(xn); 
                }
            }
            xmlDoc.Save(strFileName); 
        }
        /// <summary>
        /// 验证IP地址
        /// </summary>
        /// <param name="IP"></param>
        /// <returns></returns>
        public bool IPCheck(string IP)
        {
            string num = @"(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)";   //创建正则表达式字符串
            return Regex.IsMatch(IP,    //使用正则表达式判断是否匹配
                ("^" + num + "\\." + num + "\\." + num + "\\." + num + "$"));
        }
        /// <summary>
        /// 验证中文IsChinese
        /// </summary>
        /// <param name="str_chinese"></param>
        /// <returns></returns>
        public bool IsChinese(string str_chinese)
        { 
            return System.Text.RegularExpressions.Regex.  //使用正则表达式判断是否匹配
                IsMatch(str_chinese, @"^[\u4e00-\u9fa5]{1,}$"); 
        }
        /// <summary>
        /// 验证输入的是字母
        /// </summary>
        /// <param name="str_Letter"></param>
        /// <returns></returns>
        public bool IsLetter(string str_Letter)
        { 
            return System.Text.RegularExpressions.Regex.        
                IsMatch(str_Letter, @"^[A-Za-z]+$"); 
        }

        string filenameDbconfig = Utility.filenameDbconfig;
        private void ReLoadDatabaseList()
        {
            Utility.listDb.Clear();
            if (File.Exists(filenameDbconfig))
            {
                try
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(filenameDbconfig);

                    XmlNode xn = doc.SelectSingleNode("Database");
                    // 得到根节点的所有子节点
                    XmlNodeList xnl = xn.ChildNodes;
                    foreach (XmlNode xn1 in xnl)
                    {
                        databaseClass model = new databaseClass();
                        XmlElement xe = (XmlElement)xn1;// 将节点转换为元素,便于得到节点的属性值
                        model.title = xe.GetAttribute("title");
                        // 得到database节点的所有子节点
                        XmlNodeList xnl0 = xe.ChildNodes;
                        model.dbip = xnl0.Item(0).InnerText;
                        model.database = xnl0.Item(1).InnerText;
                        model.dbuser = xnl0.Item(2).InnerText;
                        model.dbpassword = xnl0.Item(3).InnerText;

                        Utility.listDb.Add(model);
                    }
                }
                catch (Exception ex)
                {
                    LogError.PublishError(ex);
                }
            }
            else
            {
                MessageBox.Show("配置文件" + filenameDbconfig + "不存在!", "提示");
            }
        }

        
    }
}