C#与mysql做ASP.NET网页数据库查询速度测试

时间:2022-03-13 19:00:14

两种方法是: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论坛搬家到博客园,欢迎转载)