首页 > 数据库 >C# 使用SQLDMO备份数据库时不显示进度的问题解决方法

C# 使用SQLDMO备份数据库时不显示进度的问题解决方法

时间:2023-01-19 13:56:14浏览次数:41  
标签:string SQLDMO C# 备份 new svr 数据库

在使用SQLDMO备份数据库的过程中,参考了网上的例子,但是进度条却不显示,每次返回的都是0,解决方法是使用全局变量,每次做个累加就可以了。

        string ServerName = "";
        string UserName = "sa";//暂时锁定,可以根据需要自己设置
        string Password = "sa";
        string DataPath = "E:\\数据库备份\\"; //数据库备份路径
        bool successFlag = false;  //备份是否成功的标志
        int step = 1;  //进度条

        private void Form1_Load(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;
        }



        //获取数据库列表
        public ArrayList GetDbList(string strServerName, string strUserName, string strPwd)
        {
            string ServerName = strServerName;
            string UserName = strUserName;
            string Password = strPwd;

            ArrayList alDbs = new ArrayList();
            SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass();
            SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass();
            try
            {
                svr.Connect(ServerName, UserName, Password);
                foreach (SQLDMO.Database db in svr.Databases)
                {
                    if (db.Name != null)
                        alDbs.Add(db.Name);
                    L_data.Items.Add(db.Name);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("连接数据库出错:" + e.Message);
            }
            finally
            {
                svr.DisConnect();
                sqlApp.Quit();
            }
            return alDbs;
        }

        //备份数据
        public bool BackUPDB(string strDbName, string strFileName, ProgressBar pgbMain)
        {
            ProgressBar PBar = pgbMain;
            SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass();
            try
            {
                svr.Connect(ServerName, UserName, Password);
                SQLDMO.Backup bak = new SQLDMO.BackupClass();
                bak.Action = 0;
                bak.Initialize = true;
                SQLDMO.BackupSink_PercentCompleteEventHandler pceh = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);
                bak.PercentComplete += pceh;
                bak.Files = strFileName;//这里可以写成路径+文件名形式,自己写!
                bak.Database = strDbName;
                bak.SQLBackup(svr);
                L1.Items.Add(DateTime.Now.ToShortDateString() + " 数据库备份完成,位置为:" + strFileName);
                PBar.Value = 0;
                successFlag = true;
                return true;
            }
            catch (Exception err)
            {
                throw (new Exception("备份数据库失败" + err.Message));
                L1.Items.Add(DateTime.Now.ToShortDateString() + " 数据库备份失败!");
            }
            finally
            {
                svr.DisConnect();
            }
        }
        //进度条,precent返回值是0,备份完成会返回10次,所以这里用step来计数,然后乘10给进度条
        private void Step(string message, int percent)
        {
            
            PBar.Value = step*10;  
            step += 1;
        }

        private void btn_load_Click(object sender, EventArgs e)
        {
            //显示数据库
            ServerName = txt_IP.Text.Trim().ToString();
            UserName = txt_user.Text.Trim().ToString();
            Password = txt_pass.Text.Trim().ToString();
            

            if (UserName.Length < 2) 
            {
                MessageBox.Show("请输入正确的数据库用户名");
                return;
            }
            if (Password.Length < 1)
            {
                MessageBox.Show("请输入正确的数据库密码,不支持空密码输入");
                return;
            }
            GetDbList(ServerName, UserName, Password);


            //检查备份路径是否存在
            try
            {
                if (!Directory.Exists(DataPath))
                {
                    DirectoryInfo di = Directory.CreateDirectory(DataPath);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("创建目录失败:{0}", ex.ToString());
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //备份数据库
            string DataName = L_data.SelectedItem.ToString();
            string Filename = DataPath + DataName + "_" + DateTime.Now.ToShortDateString();

            L1.Items.Add(DateTime.Now.ToShortDateString() + " 选择了"+DataName+"进行备份!");
            successFlag = false;
            step = 1;

            Thread t1 = new Thread(() => BackUPDB(DataName, Filename, PBar));
            t1.IsBackground = true;
            t1.Start();
            

            
            
        }

 

标签:string,SQLDMO,C#,备份,new,svr,数据库
From: https://www.cnblogs.com/wjbych/p/17061379.html

相关文章

  • Nextcloud安装扩展记录以及问题解决方法
    1、Nextcloud支持显示视频缩略图-23-01-19安装yasm(http://www.tortall.net/projects/yasm/releases/)wgethttp://www.tortall.net/projects/yasm/releases/yasm-1.3.0.......
  • VK Cup 2022 F. Bracket Insertion
    有一个初始为空的括号序列,依次执行\(n(n\le500)\)次操作,每次有\(p\)的概率选取(),\(1-p\)的概率选取)(,随机插入首部、尾部、中间的空隙(也就是从\(2i-1\)个位置中......
  • 找request的Trace文件
    select'TraceName:'||dest.value||'/'||lower(dbnm.value)||'_ora_'||oracle_process_id||'.trc','FileName:'||execname.execution_fil......
  • Abp为什么要用IGuidGenerator.Create()而不用Guid.NewGuid()
    InnoDB主键索引类型为聚簇索引。按照聚簇索引排列顺序,数据是按顺序紧密相连的。对有序主键查询一定范围数据,数据库可以从更少的数据块中提取数据,节省了大量的IO操作,提高查......
  • C++ OpenCV
    准备工作Ubuntu系统(虚拟机和物理机、服务器都可以)OpenCV3.4.1压缩包OpenCVcontrib3.4.1压缩包版本信息GCC版本Ubuntu11.3.0-1ubuntu1~22.04G++版本U......
  • java.lang.UnsupportedClassVersionError
    一般是版本不兼容Exceptioninthread"main"java.lang.UnsupportedClassVersionError:org/eclipse/swt/events/ShellListenerhasbeencompiledbyamorerecentver......
  • C#异常
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespacelearn_try{internalclassP......
  • 学习笔记——SpringMVC简介;SpringMVC处理请求原理简图;SpringMVC搭建框架
    2023-01-19一、SpringMVC简介1、SpringMVC是Spring子框架2、SpringMVC是Spring为“控制层”提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架。3、SpringMV......
  • 使用 IDEA 工具打开vue/react/node项目
    1.IDEA在官网上下载社区免费版的https://www.jetbrains.com/zh-cn/idea/download/#section=mac下载完成后,一直点击next安装即可2.安装完成后点击open打开gitcl......
  • C/C++学籍管理系统[2023-01-19]
    C/C++学籍管理系统[2023-01-19]使用下面的数据,用C/C++设计一个简单的学籍管理系统,实现出最基本的功能。学生基本信息文件(A.TXT)及其内容:A.TXT文件不需要编程录入数据,可......