C#实现类似navicat一样操作MySQL数据库的界面(MyBatis逆向工程思路)

 

在我之前学习到java数据库框架mybatis逆向工程时惊叹了一会儿,想了想这个思路理应早该想到。我们使用navicat工具创建了数据表还要写SQL语句跟表字段一一对应,多么费劲的一件事。SQL语句的增删查改万变不离其宗,变的只是库、表、字段等,也就是说我们动态获取到库、表、字段这些名字后动态插入SQL语句中不就完事了?

于是今天呈有空就用C#实现了一个可以获取所有库、表、字段的demo,可以像navicat一样通过点击事件查看任意库任意表任意数据,还能像任意表进行增删查改功能。

以下只展示其中一个小模块:查询任意库中的任意表中的数据

导入Dll:MySql.Data.dll

窗口设计:

Form1:

Form2:

 

代码:

Form1:

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }
       
        //重置
        private void button2_Click(object sender, EventArgs e)
        {
            this.textBox1.Text = "";
            this.textBox2.Text = "";
            this.textBox3.Text = "";
        }
        //连接
        private void button1_Click(object sender, EventArgs e)
        {
            string server = this.textBox1.Text;
            string userid = this.textBox2.Text;
            string password = this.textBox3.Text;


            Form2 f = new Form2(server, userid, password , out bool status);
            if (status)
            {
                f.Show();
                return;
            }
            MessageBox.Show("连接失败!");
        }
    }

Form2:

 public partial class Form2 : Form
    {
        string server,  userid,  password;
        MySqlConnection conn;
        public Form2(string server, string userid, string password , out bool status)
        {
            InitializeComponent();

            this.server = server;
            this.userid = userid;
            this.password = password;

            if (OpenConnection())
            {
                status = true;
            }
            else
            {
                status = false;
            }
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            //加载库名
            this.comboBox1.Items.AddRange(GetDatabases());
        }
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.comboBox2.Items.Clear();
            string item = (sender as ComboBox).Text;
            this.comboBox2.Items.AddRange(GetTables(item));
        }
        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            string database = this.comboBox1.Text;
            string table = this.comboBox2.Text;

            this.dataGridView1.Columns.Clear();
            this.dataGridView1.Rows.Clear();

            string[] datas = GetField(database, table);
            //加载字段
            dataGridView1.ColumnCount = datas.Length;
            for (int i = 0; i < datas.Length; i++)
            {
                this.dataGridView1.Columns[i].Name = datas[i];
            }
            //加载数据
            List<string[]> dataList = GetDatas(database,datas, table);
            int listCount = dataList.Count;
            for (int i = 0; i < dataList[0].Length; i++)
            {
                for (int j = 0; j < listCount; j++)
                {
                    this.dataGridView1.Rows.Add();
                    try
                    {
                        dataGridView1.Rows[i].Cells[j].Value = dataList[j][i];
                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }
        #region 操作数据库
        //打开mysql连接
        private bool OpenConnection()
        {
            try
            {
                string strConn = "server=" + server +
                                ";userid=" + userid +
                                ";password=" + password;
                conn = new MySqlConnection(strConn);
                conn.Open();
            }
            catch (Exception)
            {

                return false;
            }
            return true;
        }
        private bool OpenConnection(string database)
        {
            try
            {
                string strConn = "server=" + server +
                                ";userid=" + userid +
                                ";password=" + password +
                                ";Database=" +database;
                conn = new MySqlConnection(strConn);
                conn.Open();
            }
            catch (Exception)
            {

                return false;
            }
            return true;
        }
        //关闭mysql连接
        private bool CloseConnection()
        {
            try
            {
                conn.Close();
                return true;
            }
            catch (Exception)
            {

                return false;
            }
        }
        //增删改
        private bool AddUpdateDelet(string sql)
        {
            if (CloseConnection())
            {
                MySqlCommand msc = new MySqlCommand(sql, conn);
                int status = msc.ExecuteNonQuery();
                CloseConnection();
                if (status > 0)
                {
                    return true;
                }
                return false;
            }
            return false;
        }
        //查询
        private MySqlDataReader Select(string sql)
        {
            if (OpenConnection())
            {
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                MySqlDataReader dataReader = cmd.ExecuteReader();
                dataReader.Read();
                return dataReader;
            }
            return null;
        }
        private MySqlDataReader Select(string database,string sql)
        {
            if (OpenConnection(database))
            {
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                MySqlDataReader dataReader = cmd.ExecuteReader();
                dataReader.Read();
                return dataReader;
            }
            return null;
        }
        //获取数据库名
        private string[] GetDatabases() {
            try
            {
                string getDatabaseSql = "SELECT  GROUP_CONCAT(DISTINCT Table_schema) FROM information_schema.`TABLES`";
                MySqlDataReader data = Select(getDatabaseSql);
                MessageBox.Show("" + data[0]);
                return data[0].ToString().Split(',');
            }
            finally
            {
                CloseConnection();
            }
        }
        //获取数据表名
        private string[] GetTables(string database) {
            try
            {
                string getTabesSql = "SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='"+ database + "'";
                MySqlDataReader data = Select(getTabesSql);
                return data[0].ToString().Split(',');
             }
            finally
            {
                CloseConnection();
            }
        }
        //获取表字段名
        private string[] GetField(string database , string table) {
            try
            {
                string getFieldSql = "SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.Columns WHERE table_name='"+ table + "' AND table_schema='"+ database + "'";
                MySqlDataReader data = Select(getFieldSql);
                return data[0].ToString().Split(',');
            }
            finally
            {
                CloseConnection();
            }
        }
        //获取表数据
        private List<string[]> GetDatas(string database, string[] fields ,string  table) {
            List<string[]> dataList = new List<string[]>();
            foreach (string field in fields)
            {
                try
                {
                    string getDataSql = "SELECT GROUP_CONCAT(" + field + ") FROM " + table + "";
                    MySqlDataReader data = Select(database,getDataSql);

                    dataList.Add(data[0].ToString().Split(','));
                }
                finally
                {
                    CloseConnection();
                }
            }
            return dataList;
        }
        #endregion
    }

效果:

(数据库工具中的mysql数据库内容)

 

(demo效果)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值