由于项目需要,我写了一个初始MySQL数据库的工具;

一, 思路:

(1),首先读取包含mysql语句的脚本(其中有创建数据库,表,插入初始数据等!)。

(2),然后替换里面的一些数据值(如guid,注释等!)。

(3),把替换后的数据流重新写入mysql脚本。

(4),调用MySQL命令执行相应的命令。

主要思路结束!

二,   现具体过程如下:

1,主界面如图:

2,全局代码和构造方法如下:

CodestringIP;

stringuserName;

stringuserPwd;

stringpath;

stringmesg="";

        Boolean info=false;

//字符串形式的guidstring_guID="";

stringtimeMesg="";

inti=0;

//测量间隔运行时间Stopwatch stop=newStopwatch();

publicToolForm()

{

            InitializeComponent();

        }

3,在按钮事件中验证了各个文本框中的值是否为空;IP地址和端口号的验证!

代码如下:

Code

/**///按钮事件

/////////

privatevoidbtnOK_Click(objectsender, EventArgs e)

{

            i=0;

this.lbMessage.Text="";

            IP=this.tbIP.Text.Trim();

            userName=this.tbUserName.Text.Trim();

            userPwd=this.tbPWD.Text.Trim();

            DirPath=Application.StartupPath;

            Regex regexIP=newRegex(@"^((0|1[0-9]{0,2}|2[0-9]{0,1}|2[0-4][0-9]|25[0-5]|[3-9][0-9]{0,1})\.){3}(0|1[0-9]{0,2}|2[0-9]{0,1}|2[0-4][0-9]|25[0-5]|[3-9][0-9]{0,1})$");

if(string.IsNullOrEmpty(IP))

{

                MessageBox.Show("请输入服务器地址!");

this.tbIP.Focus();

return;

            }elseif(string.IsNullOrEmpty(userName))

{

                MessageBox.Show("请输入用户名!");

this.tbUserName.Focus();

return;

            }elseif(string.IsNullOrEmpty(userPwd))

{

                MessageBox.Show("请输入密码!");

this.tbPWD.Focus();

return;

            }elseif(regexIP.IsMatch(IP)||(string.Compare(IP,"localhost",true)==0))

{

//得到目录下的所有文件string[] files=Directory.GetFiles(DirPath);

//循环读文件foreach(stringfileinfiles)

{

//如果后缀名为.sql文件if(".sql".IndexOf(file.Substring(file.LastIndexOf(".")+1))>-1)

{

//把.sql文件全名加人到fileList集合中fileList.Add(file);

                    }                }

if(fileList.Count>1)

{

                    MessageBox.Show("目录下多个.sql文件!该程序只能读一个!");

return;

                }elseif(fileList.Count<1)

{

                    MessageBox.Show("目录下没有.sql文件!");

return;

                }else

{

                    path=fileList.First();

this.lbMessage.Text="正在导入数据!请稍等

..";

//测量时间开始stop.Start();

//调用主方法MainMethod();

                }            }else

{

                MessageBox.Show("服务器IP地址不规范!");

this.tbIP.Focus();

return;

            }

        }

4, 如果输入符和规范,则调用主方法(主方法里实现思路中主要方法的调用);

主方法代码如下:

Code

/**///主方法

//////////////////

privatevoidMainMethod()

{

try

{

//读文件stringfileRed=ReadSQLFromFile(path);

//写文件File.WriteAllText(path, fileRed);

//调用进度条的timerthis.timer1.Start();

//调用执行脚本文件的timerthis.timer2.Start();

            }catch(Exception ex)

{

                MessageBox.Show(ex.Message);

            }

        }

5,    读脚本文件,替换guid标识的方法;

代码如下:

Code

/**///读文件流,替换guid标示

////////////

privatestringReadSQLFromFile(stringpath)

{

//新生成一个guidGuid guId=Guid.NewGuid();

//把guid转换为字符串形式的guid_guID="{"+guId+"}";

            FileStream fs=null;

stringstrQuery="";

try

{

                fs=newFileStream(path, FileMode.Open, FileAccess.Read);

stringstrTemp=Encoding.UTF8.GetString(ConvertStreamToByteBuffer(fs));

//用新生成的guid替换掉脚本文件中的guid;strQuery=Regex.Replace(strTemp,@"(\{[A-Fa-f0-9]{8}(-[A-Fa-f0-9]{4}){3}-[A-Fa-f0-9]{12}\})+", _guID, RegexOptions.Singleline);

intindexValue=strQuery.IndexOf("USE")+3;

intindexStart=indexValue;

intindexEnd=0;

while(strQuery.Substring(indexValue,1)!=";")

{

                    indexValue++;

                    indexEnd=indexValue;

                }                DBName=strQuery.Substring(indexStart, (indexEnd-indexStart));

            }catch(Exception ex)

{

                MessageBox.Show(ex.Message);

                strQuery="";

            }finally

{

                fs.Close();

            }

returnstrQuery;

        }

6,把替换后的字符串写入脚本文件:

代码如下:

CodeFile.WriteAllText(path, fileRed);

7,然后是开启两个timer,一个控制进度条,另一个获取执行时间的间隔。这里略。。。

8,在获取执行时间的timer事件中,调用执行脚本文件的方法。

该方法的代码如下:

Code

/**///调用mysql命令来执行脚本文文件

//////////////////

publicstringRunCmd()

{

            Stopwatch a=newStopwatch();

longm=a.ElapsedMilliseconds;

stringmesg="";

stringmesgError="";

            Process p=null;

try

{

进入cmd调用mysql命令来执行脚本文件#region进入cmd调用mysql命令来执行脚本文件                p=newProcess();

                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;

                p.Start();

//p.StandardInput.WriteLine(@"net start mysql");p.StandardInput.WriteLine(@"c:");

                p.StandardInput.WriteLine(@"cd C:\Program Files\MySQL\MySQL Server 5.0\bin");

                p.StandardInput.WriteLine(string.Format("mysql.exe -h{0} -u{1} -p{2} -f{3}\"", IP, userName, userPwd, path));

                p.StandardInput.WriteLine("exit");

                mesgError=p.StandardError.ReadToEnd();

                mesg=mesgError;

                p.WaitForExit();

#endregion            }catch(Exception err)

{

//MessageBox.Show(err.Message);//显示错误信息。mesg=err.Message;

            }finally

{

                p.Close();

            }returnmesg;

        }

9,把给定的文件流转换为二进制字节数组的方法,

代码如下:

Code

把给定的文件流转换为二进制字节数组byte[] ConvertStreamToByteBuffer(System.IO.Stream theStream)#region把给定的文件流转换为二进制字节数组byte[] ConvertStreamToByteBuffer(System.IO.Stream theStream)

/**///把给定的文件流转换为二进制字节数组。

/////////

publicbyte[] ConvertStreamToByteBuffer(System.IO.Stream theStream)

{

intb1;

            System.IO.MemoryStream tempStream=newSystem.IO.MemoryStream();

while((b1=theStream.ReadByte())!=-1)

{

                tempStream.WriteByte(((byte)b1));

            }returntempStream.ToArray();

        }#endregion

10,控制进度条的timer事件;

代码如下:

Code//控制进度条显示/privatevoidtimer1_Tick(objectsender, EventArgs e)

{try{this.progressBar1.Value=i;

i+=10;if(i==1000)

{this.timer1.Stop();if(string.IsNullOrEmpty(mesg)&&info)

{

lbMessage.Text="数据导入成功!"+timeMesg;newMCFrom(_guID, IP, userName, userPwd, DBName).ShowDialog();

}else{

lbMessage.Text="数据导入失败!";

}

stop.Reset();

}

}catch(System.Exception )

{

}

}

11,获取执行时间间隔的time事件;

代码如下:

Code

/**///调用执行脚本文件的方法,并得到从点击按钮到成功导入数据库后的间隔时间。

/////////

privatevoidtimer2_Tick(objectsender, EventArgs e)

{

//执行文件中的命令mesg=RunCmd();

this.timer2.Stop();

            info=true;

            timeMesg=stop.Elapsed.Seconds.ToString()+"秒";

            stop.Stop();

        }

12,整个小工具大体的程序代码完成!有些细节省略掉了 !请在我的随笔里查看!

自己如何写mysql数据库_自己手写的一个初始化MySQL数据库的工具!相关推荐

  1. matlab朴素贝叶斯手写数字识别_从“手写数字识别”学习分类任务

    机器学习问题可以分为回归问题和分类问题,回归问题已经在线性回归讲过,本文学习分类问题.分类问题跟回归问题有明显的区别,回归问题是连续的数值,而分类问题是离散的类别,比如将性别分为[男,女],将图片分为 ...

  2. 在钉钉上怎么手写_数码知识:钉钉手写签名如何设置开启手写签名教程

    如今使用IT数码设备的小伙伴们是越来越多了,那么IT数码设备当中是有很多小技巧的,这些技巧很多小伙伴一般都是不知道如何来实用的,就好比最近就有很多小伙伴们想要知道钉钉手写签名如何设置开启手写签名教程, ...

  3. 深度学习实战14(进阶版)-手写文字OCR识别,手写笔记也可以识别了

    大家好,我是微学AI,今天给大家带来手写OCR识别的项目.手写的文稿在日常生活中较为常见,比如笔记.会议记录,合同签名.手写书信等,手写体的文字到处都有,所以针对手写体识别也是有较大的需求.目前手写体 ...

  4. 手写数字识别案例、手写数字图片处理

    python_手写数字识别案例.手写数字图片处理 1.手写数字识别案例 步骤: 收集数据 带有标签的训练数据集来源于trainingDigits文件夹里面所有的文件,接近2000个文件,每个文件中有3 ...

  5. ipad手写笔排行榜,ipad手写笔平价推荐

    Ipad手写笔要买原装的吗?原装那么贵值不值得买?如果你有高预算,那么原装肯定是最好的选择,但是如果你不打算花那么多的钱去买一直ipad手写笔,那么平替笔就是最好的选择.以现在的国内技术来说,其实平替 ...

  6. 神了!阿里数据库专家纯手写了这份604页的Oracle+MySQL攻坚指南

    为什么要学习Oracle+MySQL? Oracle在金融.电信.交通.医疗.制造业.能源等诸多领域的使用非常广泛,其拥有完善的生态体系,多样化的数据库选件,在高可用性.高性能.高安全性.高数据服务能 ...

  7. 神了,阿里数据库专家纯手写了这份604页的Oracle+MySQL攻坚指南

    为什么要学习Oracle+MySQL? Oracle在金融.电信.交通.医疗.制造业.能源等诸多领域的使用非常广泛,其拥有完善的生态体系,多样化的数据库选件,在高可用性.高性能.高安全性.高数据服务能 ...

  8. mybatis 无法初始化类_从零开始手写 mybatis(一)MVP 版本

    什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyB ...

  9. druid连接池初始化慢_从零开始手写 mybatis (三)jdbc pool 从零实现数据库连接池

    前景回顾 第一节 从零开始手写 mybatis(一)MVP 版本 中我们实现了一个最基本的可以运行的 mybatis. 第二节 从零开始手写 mybatis(二)mybatis interceptor ...

最新文章

  1. OverflowError: cannot fit ‘int‘ into an index-sized integer
  2. 全国大学生智能汽车竞赛-讯飞赛道开始报名啦!
  3. c语言设计程序框图,C语言课程设计————写下流程图! 谢谢
  4. vim配置python代码提示,VIM配置成Python IDE
  5. git gui怎么拉取项目代码_Git GUI使用方法【转】
  6. Skywalking部署常见问题以及注意事项
  7. matlab将满足某一条件的矩阵元素置零
  8. word中如何将所有字母一次修改成新罗马字体
  9. 随想录(easyx开发上位机)
  10. 如何理解 Spring AOP 以及使用 AspectJ?
  11. url 获取 geoserver 中对应的style
  12. 计算机应用基础论坛发帖,计算机应用基础串讲冲刺讲义(一)_IT教育论坛_计算机学习论坛_学赛网_IT在线教育平台...
  13. IE9 和 IE11 安装及相关补丁
  14. Idea编写简单Java网络爬虫程序(maven)
  15. (PTA)数据结构(作业)5、堆栈
  16. 快速了解使用ncurses(按键的快速响应)
  17. SEO必备:搜索引擎优化技巧
  18. Ai 文字正确描边 文字描边
  19. Excel 2010 VBA 入门 098 导入Access数据库的数据
  20. 2019年中国金融信息化软件开发企业排名

热门文章

  1. 五种常用的异常值检测方法(均方差、箱形图、DBScan 聚类、孤立森林、Robust Random Cut Forest
  2. 百合网站的模拟IE外挂
  3. 怎样看大盘指数即时分时走势图
  4. 普通人做自媒体短视频,现在自媒体平台还有啥赛道可做的?
  5. 夸克某上万资源目录结构解析
  6. 新浪微博SDKdemo
  7. 2020新版siteground主机空间服务器购买选择图文教程-跨境电商外贸网站最佳主机空间
  8. 读书 -- 《天才在左 疯子在右》
  9. ABP官方文档(十八)【领域服务】
  10. 本机DNS服务器地址查询