手机版

用C#制作关系型数据库数据库批量备份还原工具

时间:2021-08-04 来源:互联网 编辑:宝哥软件园 浏览:

类型:电子教程大小:8.5M语言:中文评分:8.3标签:立即下载在这篇文章我们学习用C#来操作,并制作一个备份还原工具。

我们要操作cmd.exe使用到了过程类,使用这个类首先要引入命名空间系统。诊断,此类提供对本地和远程进程的访问并能够启动和停止本地系统进程。

///摘要///执行煤矿管理局命令////summary///param name=' working directority '要启动的进程的目录/param ///param name='command '要执行的命令/param公共静态void StartCmd(字符串工作目录,字符串命令){ Process p=new Process();p . StartInfo。文件名=' cmd。exe ';p . startinfo工作董事=工作董事;p . startinfouseshellexecute=falsep . startinforedirectstandard输入=truep . startinforedirectstandard输出=truep . startinforedirectstandardererror=truep . startinfocreatenowindow=true开始();p.StandardInput.WriteLine(命令);标准输入。写入行(“退出”);等待外汇关闭();}

在看看如何使用上方法:

字符串appdircetroy=' c : \ \程序文件\ \ MySQL \ \ MySQL Server 5.5 \ \ bin '字符串cmd=' MySQL转储-hlocalhost-uroot-prout-default-字符集=utf8-lock-tables-routines-force-quick Dbmnamed : \ backup。' SQL '

StartCmd(appdircetroy,cmd);

这里我们同过程操作cmd.exe,调用mysqldump.exe执行命令-hlocalhost-uroot-proof-default-character-set=utf8-lock-tables-routines-force-quick Dbmnamed : \ backup。' SQL '备份数据库。其实我们也可以直接通过过程类直接调用mysqldump.exe进程执行命令,写法如下:

///摘要///使用逻辑备份执行命令命令////summary////param name=' AppPath ' MySQL转储。可执行程序的扩展名的目录/param///param name=' command '/param public static void StartMySqldump(string AppPath,string command){ ProcessStartInfo psi=new ProcessStartInfo(AppPath @ ' \ mysqldump。exe ');psi .参数=命令;psi .UseShellExecute=falsepsi .RedirectStandardOutput=truepsi .RedirectStandardInput=truepsi .RedirectStandardError=truepsi .CreateNoWindow=true过程专业=过程。开始(磅/平方英寸);专业人士wait foreit();专业人士close();}

调用的方法和上面的使用基本一致,就是命令命令不需要写逻辑备份改为-hlocalhost-uroot-proof-default-character-set=utf8-lock-tables-routines-force-quick Dbmnamed : \ backup。“SQL”。

我再这里使用方法1,比较灵活方便,因为我们原因的使用也可以用到此方法执行mysql.exe还原命令,上篇中说到还原时,数据库如何不存在的使用,我们要先创建数据库,再还原,那么就是要执行两天命令,我们可以改一下方法1,使它可以执行多条命令,如下:

///摘要///执行煤矿管理局命令////summary///param name=' working directority '要启动的进程的目录/param ///param name='command '要执行的命令/param公共静态void StartCmd(字符串工作目录,字符串[]命令){流程p=新流程();p . StartInfo。文件名=' cmd。exe ';p . startinfo工作董事=工作董事;p . startinfouseshellexecute=falsep . startinforedirectstandard输入=truep . startinforedirectstandard输出=truep . startinforedirectstandardererror=truep . startinfocreatenowindow=true开始();foreach(命令中的字符串标准输入。write line(cmd);标准输入。写入行(“退出”);等待外汇关闭();}

有了上面的函数,编写一个程序备份还原工具就比较容易实现了,但是现在我要备份300多个数据库,我要生成300多个数据库备份文件,当然我们也可以通过命令将300多个数据库,即所有数据库(包含关系型数据库自带的系统库)备份到一个文件夹。还有一点要注意就是用户体验,假如备份的一个数据库很大,那么直接调用就会吧用户界面卡死,所以我们要用异步线程来解决此问题,我打算用四个线程同时执行备份,直到300多个数据库执行完毕。

有人可能对线程不熟悉,不用怕,其实。网提供了一个异步线程的封装BackgroundWorker,用此类可以很简单实现。我们用到BackgroundWorker提供的两个事件DoWork和RunWorkerCompleted,DoWork中写线程开始要执行的任务,RunWorkerCompleted中写线程执行的任务结束要执行的工作。看看简单的代码示例:

后台工作者后台工作者=新后台工作者();backgroundWorker .DoWork=new DoWorkEventHandler(后台Worker _ DoWork);backgroundWorker .RunWorkerCompleted=new runworkercompletedeventhaller(backgroundWorker _ RunWorkerCompleted);backgroundWorker .RunWorkerAsync(remainDbNames);//remainDbName是列表字符串类型,传入的参数,我保存要备份的库的名字,备份一个库就移除一个库

private void background worker _ DoWork(对象发送方,DoWorkEventArgs e){ Liststring name=e。参数为Liststring//获取传入的参数ramainDbName

BackupMany(文件路径、名称、boolback数据);//执行备份方法//e .结果=e .参数。tostring();//完成任务时向异步操作完成后方法传递的结果参数

}

private void backgroundWorker _ RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e){ 0

//写文本(文本结果,真,)完成数据库' e.Result.ToString()'备份操作环境. NewLine);

}

使用就是那么简单,下面看看我启用四个线程同时备份:

//只有在备份按钮事件中生成个异步线程即可for(int I=0;i4;I){后台工作者后台工作者=新后台工作者();backgroundWorker .DoWork=new DoWorkEventHandler(后台Worker _ DoWork);backgroundWorker .RunWorkerCompleted=new runworkercompletedeventhaller(backgroundWorker _ RunWorkerCompleted);backgroundWorker .RunWorkerAsync(remainDbNames);}

下面看看单个线程具体如何从remainDbName中取数据库的名字执行备份

对象锁定对象=新对象();//备份时的锁对象委托void WriteText(TextBox,bool append,字符串文本);私有void writeText(TextBox,bool append,字符串msg) { if (this .InvokeRequired){写入文本d=新写入文本(写入文本);对象[] obj=新对象[3];obj[0]=textbox;obj[1]=追加;obj[2]=msg;这个。援引(d,obj);} else { if(追加)文本框附加文本(msg);其他文本框Text=msg } } private void BackupMany(字符串路径,Liststring dbNames,bool backup data){字符串名称=nulllock (lockobject) { if (dbNames .计数0){ name=DBNAmES[0];数据库名在(0)处移除;} } if (name!=空){备份(路径、名称、备份数据);BackupMany(路径、数据库名、备份数据);} else { timer1 .使能=假写文本(文本结果,真'全部执行完成!');} }私有无效备份(字符串路径,字符串数据库名称,布尔备份数据){尝试{写入文本(文本结果,真,日期时间.'现在。' ToString()'开始数据库数据库名称备份环境. NewLine);//String命令=' MySQL转储-快速-主机=localhost-默认-字符集=GB 2312-锁表-详细-强制-端口=端口号-用户=用户名-密码=密码数据库名-r备份到的地址;//构建执行的命令字符串目录=路径" \ \ "数据库名.SQL ';字符串命令;if (backupdata) { command=string .格式(' MySQL转储-快速-主机={ 1 }-默认-字符集={ 2 }-锁-表-例程-强制-端口={ 3 }-用户={ 4 }-密码={ 5 } { 6 }-r \ ' { 0 } \ ',目录,主机,字符集,端口,用户,密码,Databasename);} else { command=string .格式(' MySQL转储-快速-主机={ 1 }-默认-字符集={ 2 }-d-锁-表-例程-强制-端口={ 3 }-用户={ 4 }-密码={ 5 } { 6 }-r \ ' { 0 } \ ',目录,主机,字符集,端口,用户,密码,Databasename);} Cmd .StartCmd(appDirecroty,command);写文本(文本结果,真,日期时间。现在。' ToString() @ '数据库已成功备份到"目录"文件中环境. NewLine);计数器;writeText(textBox1,false,'共' totlecount '个文件,已完成计数器个文件');} catch(Exception ex){ WriteText(TxtErr,true,DateTime . '现在。' ToString()'数据库数据库名称备份失败!');} }

writeText是向文本框写入文本的方法,因为副线程操作主线程生成的控件时,会有线程安全问题,所以要用异步委托。如何你知道这个怎么用,其实还有一个简单点的方法,就是把前程安全检查给关闭掉,在窗体装载中可以加入控制CheckForIllegalCrossThreadCalls=false;这句就可以跨线程操作用户界面而不会报错。还原的实现和备份的操作差不多,这里就不提了。本想上传个一下代码可是找不到上传的方法。

版权声明:用C#制作关系型数据库数据库批量备份还原工具是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。