C#与mysql做ASP.NET网页数据库查询速度测试
刚来实习,被小组长安排做个数据库访问查询速度的测试,刚从学校出来,而且本身是学嵌入式开发的,对数据库和C#只是仅业余玩过,因此刚开始不知道自己能做成功,但后来结果出来了,自己使用了两种方法完成了数据库的查询测试。数据库中记录数最大达到80W条,构建数据库就会花费6到7个小时的时间,时间之余,发帖总结自己的经验,也希望对大家有所帮助。两种方法是: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中,显示操作用的时间。
其他控件的操作和技术类似。另附上工程源码供大家参考。有建议请多多提,大家一起讨论,共同进步!
下载地址:http://www.ibcibc.com/thread-3813-1-1.html
不错加精 编辑了下 把你下载地址拿过来了 看不懂 c#一般不用mysql 没用过mysql 涨姿势了 mysql不懂,学习了
页:
[1]