zoukankan      html  css  js  c++  java
  • Winform中实现连接Mysql8使用mysqldump实现备份表的数据

    场景

    Winform中连接Mysql8并查询表中数据进行显示:

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/120395988

    在上面实现连接Mysql8的基础上,怎样借助于mysqldump实现数据备份。

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    1、继续上面的winform的布局,设计布局如下

    2、获取需要的参数

    通过TextBox来获取备份单表的按钮的表名输入,通过Button"选择备份文件路径"以及后面的TextBox来选择要进行备份的路径。

    其中选择备份文件的路径的点击事件为

            private void button_select_path_Click(object sender, EventArgs e)
            {
                FolderBrowserDialog path = new FolderBrowserDialog();
                path.ShowDialog();
                this.textBox_bak_path.Text = path.SelectedPath;
            }

    然后通过一个TextBox来获取本机(即需要运行Winform的机器)的mysqldump.exe的路径,记得要带双引号。

    3、实现单表的备份

    然后再备份单表的按钮的点击事件中

            private void button4_Click(object sender, EventArgs e)
            {
                PassForm passForm = new PassForm();
                passForm.ShowDialog();
                //密码验证通过
                if (passForm.DialogResult == DialogResult.OK)
                {
                    string mysqlDumpPath = this.text_mysqldump_path.Text.Trim();
                    string tableName = this.text_one_table.Text.Trim();
                    if (String.IsNullOrEmpty(tableName))
                    {
                        MessageBox.Show("表名不能为空!!!");
                    }
                    else if (String.IsNullOrEmpty(mysqlDumpPath))
                    {
                        MessageBox.Show("mysqldump的路径不能为空!!!");
                    }
                    else
                    {
                        string cmdStr = mysqlDumpPath + " -h " + this.host.Text.Trim() + " -u" + this.username.Text.Trim() + " -p" + this.password.Text.Trim() + " " + this.database.Text.Trim() + " " + this.text_one_table.Text.Trim() + " > " + """ + this.textBox_bak_path.Text.Trim() + "\" + "bus_area.sql"";
                        CmdHelper.ExeCommand(cmdStr);
                    }
                }
                else
                {
                    MessageBox.Show("密码不正确");
                }
            }

    这里首先加了一个密码验证的逻辑,防止误操作乱点按钮,通过后,获取到表名和mysqldump的路径然后进行拼接成cmdStr,

    在拼接之后需要打断点到这步获取完整的cmd命令,然后再cmd中先手动执行一下试试。

    这里在执行cmd时调用了一个帮助类CmdHelper

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace mysqldatabak
    {
        using System;
        using System.Collections.Generic;
        using System.Text;
        using System.Diagnostics;
    
        namespace Helper
        {
            /// <summary>
            /// 执行命令
            /// </summary>
            public class CmdHelper
            {
                ///
                /// 执行cmd.exe命令
                ///
                ///命令文本
                /// 命令输出文本
                public static string ExeCommand(string commandText)
                {
                    return ExeCommand(new string[] { commandText });
                }
                ///
                /// 执行多条cmd.exe命令
                ///
                ///命令文本数组
                /// 命令输出文本
                public static string ExeCommand(string[] commandTexts)
                {
                    Process p = new Process();
                    p.StartInfo.FileName = "cmd.exe";
                    p.StartInfo.UseShellExecute = false;
                    p.StartInfo.RedirectStandardInput = true;
                    p.StartInfo.RedirectStandardOutput = true;
                    p.StartInfo.RedirectStandardError = true;
                    p.StartInfo.CreateNoWindow = true;
                    string strOutput = null;
                    try
                    {
                        p.Start();
                        foreach (string item in commandTexts)
                        {
                            p.StandardInput.WriteLine(item);
                        }
                        p.StandardInput.WriteLine("exit");
                        strOutput = p.StandardOutput.ReadToEnd();
                        //strOutput = Encoding.UTF8.GetString(Encoding.Default.GetBytes(strOutput));
                        p.WaitForExit();
                        p.Close();
                    }
                    catch (Exception e)
                    {
                        strOutput = e.Message;
                    }
                    return strOutput;
                }
                ///
                /// 启动外部Windows应用程序,隐藏程序界面
                ///
                ///应用程序路径名称
                /// true表示成功,false表示失败
                public static bool StartApp(string appName)
                {
                    return StartApp(appName, ProcessWindowStyle.Hidden);
                }
                ///
                /// 启动外部应用程序
                ///
                ///应用程序路径名称
                ///进程窗口模式
                /// true表示成功,false表示失败
                public static bool StartApp(string appName, ProcessWindowStyle style)
                {
                    return StartApp(appName, null, style);
                }
                ///
                /// 启动外部应用程序,隐藏程序界面
                ///
                ///应用程序路径名称
                ///启动参数
                /// true表示成功,false表示失败
                public static bool StartApp(string appName, string arguments)
                {
                    return StartApp(appName, arguments, ProcessWindowStyle.Hidden);
                }
                ///
                /// 启动外部应用程序
                ///
                ///应用程序路径名称
                ///启动参数
                ///进程窗口模式
                /// true表示成功,false表示失败
                public static bool StartApp(string appName, string arguments, ProcessWindowStyle style)
                {
                    bool blnRst = false;
                    Process p = new Process();
                    p.StartInfo.FileName = appName;//exe,bat and so on
                    p.StartInfo.WindowStyle = style;
                    p.StartInfo.Arguments = arguments;
                    try
                    {
                        p.Start();
                        p.WaitForExit();
                        p.Close();
                        blnRst = true;
                    }
                    catch
                    {
                    }
                    return blnRst;
                }
            }
    
        }
    }

    3、测试单表效果

    在建立连接成功并配置各项参数后,点击备份单表

    验证通过后到指定路径下查看结果

    4、备份所有表实现

    在备份所有表的点击事件中

            private void button_bak_all_Click(object sender, EventArgs e)
            {
                PassForm passForm = new PassForm();
                passForm.ShowDialog();
                if (passForm.DialogResult == DialogResult.OK)
                {
                    DataTable tbName = mySqlConnection.GetSchema("Tables");
                    if (tbName.Columns.Contains("TABLE_NAME"))
                    {
                        foreach (DataRow dr in tbName.Rows)
                        {
                            string mysqlDumpPath = this.text_mysqldump_path.Text.Trim();
                            string tableName = (string)dr["TABLE_NAME"];
                            string cmdStr = mysqlDumpPath + " -h " + this.host.Text.Trim() + " -u" + this.username.Text.Trim() + " -p" + this.password.Text.Trim() + " " + this.database.Text.Trim() + " " + tableName + " > " + """ + this.textBox_bak_path.Text.Trim() + "\" + tableName + ".sql"";
                            CmdHelper.ExeCommand(cmdStr);
                            this.log_text.AppendText((string)dr["TABLE_NAME"] + "--备份完成");
                            this.log_text.AppendText("
    ");
                        }
                    }
                }
                else
                {
                    MessageBox.Show("密码不正确");
                }
    
            }

    逻辑是获取所有的表名然后循环拼接表名进行导出sql

    效果

    博客园: https://www.cnblogs.com/badaoliumangqizhi/ 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。
  • 相关阅读:
    WEB-INF目录与META-INF目录的作用
    Spring中的jar包详解
    fatal: Could not read from remote repository.的解决办法
    如何解决failed to push some refs to git
    Spring Boot 集成servlet,发布为可直接运行的war包,方便后续打包为docker镜像。
    使用IntelliJ IDEA,gradle开发Java web应用步骤
    git 命令使用常见问题
    自己动手搭建Git服务器-Gitblit
    windows 安装git
    springMVC 接收数组参数,mybatis 接收数组参数,mybatis批量插入/批量删除案例
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/15361571.html
Copyright © 2011-2022 走看看