zoukankan      html  css  js  c++  java
  • C#与mysql做ASP.NET网页数据库查询速度测试

    两种方法是:1,使用mysql数据库的存储过程;2,C#编码,做网页后台与mysql数据库连接,前台测试显示测试过结果
    下面我将分别讲解两种方法的具体实现。

          1,使用mysql数据库的存储过程插入万条大批量记录。(环境:mysql5.0,GUI(SQLyog),win7专业版,表student{ID,studentname,studentID,GetMAN,dateTim})查询测试的难点是构建数据库,怎样才能向数据库中放入80W条记录呢?当然不能一条一条的放了,首先我考虑的是采用纯数据库方法,写个循环,将记录插入数据库中,在开始的时候,我不知道应该在存储过程中写循环,因此老是报错(sql语句面板执行不成功)。后来在网上看帖,才知道大批量向数据库写数据只有两种方法(一是调用sql的存储过程实现,另一个是使用其他编程语言实现),单纯在sql语言面板中是无法实现的,于是我考虑采用存储过程(因为其他编程语言涉及到后台与数据库的交互和前台的显示,我自己认为不擅长,后来事实证明自己比自己想的要强许多,所以大学未出来的同胞,相信自己大学所做过的事,总有一天会发现经历的是比宝贵的财富,只要认真踏实过,不必妄自菲薄,加油!)。使用存储过程的方法其实挺简单的,但是我出现的错误主要是语法上的错误,下面我将存储过程的代码贴上,供大家参考:
    DELIMITER $$
    USE `work`$$
    DROP PROCEDURE IF EXISTS `cc`$$
    CREATE PROCEDURE `cc`( )
    BEGIN
      DECLARE pid INT;                                   //声明将要使用的变量,末尾有分号
      SET pid = 1;                                           //为变量赋值,末尾有分号

      WHILE (pid<20000) DO                            //循环语句,2W条记录,,末尾无分号

      INSERT INTO student VALUE(pid,"a",pid,"father",2014-02-07);    //单挑插入语句,使用变量pid,末尾有分号
      SET pid =pid +1;                                     //设置变量值加一,末尾有分号
      END WHILE;                                             //循环条件达到后,结束循环,末尾有分号

        END$$
    DELIMITER ;
    以上是放入两万条记录的代码,特别提醒的是注意其中的分号,有的语句需要添加分号,不然会报错,我的就是在那insert语句后忘了分号,错误耽误了许久时间,不过后来不知道怎么给发现了。然后需要大家注意的是另一个错误“duplicate entry XXXXXXX”,那是因为数据库中有相同的数据了,所以调用存储过程插入数据时,会显示上面那个,意思是字段重复,解决方法是删除数据库中已有的数据,重新插入。我是删除了所有的数据从头开始插入的,我想添加过程中不再添加已有的数据也能解决上述问题(有待实践)。我写的代码是上面上色的部分,下面我将在mysql的GUI(SQLyog)上,创建存储过程的部分详述。菜单栏中,对象->存储过程->创建存储过程,将打开一个存储过程,在相应部分添加自己的有效代码即可完成代码部分,然后命名cc(我以cc命名)保存。使用存储过程时,在sql语言面板中,  CALL cc()    ,执行即可 。如果想添加更多记录到数据库,只需修改循环中的变量(pid)即可。其中关键是如何插入大批量数据困扰了我,实际上是存储过程的语法难住了很久。到此mysql数据库添加大批量记录的存储过程方法总结完毕。挺简单的吧!

       2,C#编码,做网页后台与mysql数据库连接,前台测试显示测试过结果。(环境:VS2010,C#,网页开发,mysql5.0,表student{ID,studentname,studentID,GetMAN,dateTim})        当准备使用编程语言实现mysql数据库查询测试时,我使用了C#,因为以前上过C#的4周课程,而且小组长也让我再熟悉一下C#的开发。首先,我觉得麻烦的是和数据库相连的数据访问层的实现,然后是表现层的各种控件功能都不熟悉,逻辑层主要是数据库操作的语言sql,逻辑层不太难,但是将其与不熟悉的表现层控件和数据库融合是件痛苦的事情。我想可以先从表现层做起,拖拉控件比较简单。于是创建了一个C#的ASP.NET网页工程(命名为studentMan,)。工程默认有个登陆界面,要求输入用户名和密码,那么思路是:必须有个用户名和密码的判断函数,错误还需要返回错误提示,正确则跳转到数据库操作页面。因此登陆按键添加了一下代码:
    ...
               string strusername = LoginUser.UserName.ToString();
                string strpassword = LoginUser.Password.ToString();
                if (strusername == "user" && strpassword == "123")
                {
                    Response.Redirect("~/BLL/sqlfind.aspx");
                }
                else
                {
                    Response.Write("用户名或密码错误1");
                }

    ...
    其中温习到了Response,Redirect响应客户端请求,跳转到指定页面,Write响应客户端请求,写信息到客户端。
    现在工程能在用户名密码正确时跳转到空的web页面(sqlfind.cs),然后思路是设计好表现层的控件,经过删改,最后留下了表现层的web界面如下:
                                              


    然后需要完善各个控件的操作,那么需要涉及到对数据库的操作,现在必须完善数据访问层了,我增加了DAL文件夹,下面增加了DBdata,.cs文件。下面解析该文件的内容。数据库操作,首先需要连接并打开数据库,然后可以增删改查。关键的代码解析乳如下:
            private string database = "work";
           private string datasource = "10.167.27.93";                        //这是数据库所在机器的ip,即我的本机IP
            private string userid = "root";                                            //我的mysql数据库哟没那个湖,用户名
            private string password = "111111";                                     //root用户对应的密码
            private string portid = "3306";                                             //连接使用的端口

            private string strConnectHost = string.Empty;
            private MySqlConnection myconnection;                                //数据库连接实例
            private MySqlCommand mycommand;                                   //数据库命令的操作实例
        ...
                strConnectHost = string.Format(@"Database = {0}; Data Source = {1}; User ID = {2}; Password = {3}; CharSet = utf8; port = {4}",database, datasource, userid, password, portid);     //数据库信息
                myconnection = new MySqlConnection(strConnectHost);                            //连接数据库
                myconnection.Open();
                if (myconnection.State == ConnectionState.Open)
                    return 0;      

    ...

    代码中,学习到了强大的string.Format格式化语句,可以给string传递参数变量,在写insert循环语句部分非常有用,在字串中使用变量改变字串特别有用,本工程中还有插入数据记录,查找前10%数据,后10%数据,倒数第一个数据时用到了string.Format。然后数据库信息绑定到字串中,连接数据库,打开数据库,只需调用相应函数即可完成。

    下面以部分代码讲解数据库打开后的操作问题,代码如下:
      ...
               ConnectMysql();                                                             //连接并打开数据库
                if (myconnection.State == ConnectionState.Open)             //判断是否连接成功
                {
                    mycommand = myconnection.CreateCommand();           //创建命令实例
                    mycommand.CommandText = strSQL;                            //为命令添加SQL语言字串
                    mycommand.ExecuteNonQuery();                                  //执行命令
                    myconnection.Close();                                                   //关闭连接

                    return 0;
                }

    ...
    到此,简单的数据库操作已经写好,有点是从数据库连接打开到操作,几个简短的函数就可以搞定,确定是没有错误收集系统,因为仅限于自己的数据库查询测试,所以错误处理方面已经省略,正规项目中错误处理机制很重要。在这段代码中,我犯的错误时少了一句执行命令的语句,因此测试时能知道数据库连接上,但是增删操作无效,后来思考,添加了上了mycommand.ExecuteNonQuery();   

    下面是统计数据库中记录条数的方法:
                ...
                int count=0;
                if (myconnection.State == ConnectionState.Open)
                {
                    mycommand = myconnection.CreateCommand();
                    mycommand.CommandText = "select *from student";
                    MySqlDataReader read = mycommand.ExecuteReader();
                    while (read.Read())
                    {
                        count++;
                    }
                    return count;
                }...

    学习到了MysqlDataReader,read()为每条记录执行相同操作,我利用为每条语句执行"select *from student"获得数据库总的记录数。


    数据访问层差不多了,下面进入逻辑层的设计,在sqlfind.aspx.cs中,要实现界面中提示的控件所要展示的功能,需要在相应控件下填上处理代码:

            protected void btnselect_Click(object sender, EventArgs e)
            {

                DateTime time1 = DateTime.Now;
                string sqlstring;

                if (drplist.Text.ToString() == "第一条记录")
                {
                   
                    db.sql_database("select *from student where ID=0");
                    Response.Write("select *from student where ID=0");
                
                }
      ...

             DateTime time2 = DateTime.Now;
                
                TimeSpan time = time2.Subtract(time1);
                txtbox.Text = time.ToString();

            }

    上述代码中需要学习到了DateTime ,TimeSpan类,time1和time2分别获取数据库操作的起始时间和结束时间,time经过subtrat获得操作前后的时间差,在控件txtbox中,显示操作用的时间。

    (原创由呆萌小码制作,由IBC论坛搬家到博客园,欢迎转载)

  • 相关阅读:
    jquery中$.get()提交和$.post()提交有区别吗?
    数据库连接池的原理。为什么要使用连接池。
    execute,executeQuery,executeUpdate的区别是什么?
    数据库的三级模式与二级映像
    KMP算法(超容易理解的next数组求法)
    软件危机(含通俗理解帮助记忆)
    O(1)复杂度求一个栈的最小值
    操作系统进程状态模型
    判断单链表是否有环,如果有环则找到其环的入口
    两个单链表判断是否相交
  • 原文地址:https://www.cnblogs.com/codeinet/p/4647489.html
Copyright © 2011-2022 走看看