问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C# 在一个方法内需要多次用到MySqlDataReader

发布网友 发布时间:2022-04-07 21:48

我来回答

5个回答

懂视网 时间:2022-04-08 02:10

MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters) 2 while (dr.Read()) 3 { 4 keyWords.Add(dr["KeyWord"].ToString()); 5 } 6 dr.Close() View Code

这样处理貌似是没问题,不过在测试中,如果“keyWords.Add(dr["KeyWord"].ToString());”出现了异常,此时,程序会调到异常处理的模块,这样,就造成了下边的close方法不会被执行到,从而造成了数据库连接数的不断累加,当达到最大值时,问题就显露出来了。

下边第一种处理方式采用异常处理:

技术分享
 1 MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters);
 2 try{
 3 while (dr.Read())
 4 {
 5 keyWords.Add(dr["KeyWord"].ToString());
 6 }
 7 }
 8 catch(){
 9 }
10 finnally{
11 dr.Close();
12 }
View Code

毫无疑问,这个方法很容易想到。

第二种处理方式,这里打算使用using方法进行处理。但是根据理论知识,认为这个是可以的。但是真实的程序运行环境,确实有时不能以理论知识来指导。现在程序在这,有一个很合适的测试环境,为什么不自己测试下呢?于是就出现了一下的过程:
我是用的是MySql数据库,C#编写的程序。
首先补充一些基础知识:
1、Using定义范围:即时释放资源,在范围结束时释放资源。当在某个代码段中使用了类得实例,而希望无论什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose方法释放资源。
到达using语句末尾或者中途引发了异常并且控制离开了语句块,即触发实例的Dispose方法释放资源。
然后查看MySqlDataReader的实现:
public sealed class MySqlDataReader : DbDataReader, IDataReader, IDisposable, IDataRecord{...}
确实继承了IDisposable方法,理论上应该是正确的。
2、MySql查看连接数:
命令: show processlist; 如果是root帐号,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接。
show processlist;只列出前100条,如果想全列出请使用show full processlist; 

有了这两点理论知识,下边的测试就容易多了:
1、不使用using也不关闭连接:

技术分享
1 MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters);
2 while (dr.Read())
3 {
4 keyWords.Add(dr["KeyWord"].ToString());
5 }
View Code

测试,连接数不断增多。

2、不使用,采用关闭操作:

技术分享
1 MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters);
2 while (dr.Read())
3 {
4 keyWords.Add(dr["KeyWord"].ToString());
5 }
6 dr.Close()
View Code

测试,连接数不变化。

3、不使用Using,采用关闭操作,中间执行过程制作一个异常:

技术分享
1 MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters);
2 while (dr.Read())
3 {
4 keyWords.Add(dr["Keyord"].ToString());
5 }
6 dr.Close()
View Code

测试,连接数不断增多。

4、采用Using,无异常的情况:

技术分享
1 Using(MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters))
2 {
3 while (dr.Read())
4 {
5 keyWords.Add(dr["KeyWord"].ToString());
6 }
7 }
View Code

测试,连接数未增加。

5、采用Using中间制作一个异常:

技术分享
1 Using(MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters))
2 {
3 while (dr.Read())
4 {
5 keyWords.Add(dr["Keyord"].ToString());
6 }
7 }
View Code

测试,连接数未增加。

经过这几步的测试,就有了最初的结论。

闲话不多说,实践求真知。

Author:月夜
Time:2015-06-09

MySqlDataReader在Using中使用

标签:

热心网友 时间:2022-04-07 23:18

DataReader 是一次性读取,而且只针对一个结果集。你没办法反复使用。
你可以重复使用一个connctor,打开后读多个结果集。最后关闭。

热心网友 时间:2022-04-08 00:36

多次使用更合理,,倘若是非常频繁的读取数据库,那么可以想的出频繁的创建对象,销毁对象是个不小的开销。。。

热心网友 时间:2022-04-08 02:10

为什么要多次读取呢,多个表的话就不能连接起来吗,不推荐在一个方法内多次打开关闭太耗资源了追问因为access数据库和远程mysql数据库的不同转存问题,需要多次使用,可以不可以在类的开头打开连接,之后多次使用呢?

追答这样啊,你可以一次把想要的表数据库都读出来存到datatable或者dataset,这样就不用重复的读取了;不可以打开一次多次使用会报出未关闭的错误

热心网友 时间:2022-04-08 04:02

连接到MySQL数据库:

MySqlConnection conn = new MySqlConnection();
string connStr = String.Format("server={0};user={1}; password={2}; database=mysql; pooling=false",
                sServer, sUser, sPassword);
conn.ConnectionString = connStr;
 
try
  {
    Console.WriteLine("Connecting to MySQL...");
    conn.Open();
    // Perform database operations
  }
  catch (Exception ex)
  {
    Console.WriteLine(ex.ToString());
    return 1;
  }

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
做了电脑系统运行变慢电脑突然变的很卡开机很慢打开软件要很久是什么原... 春兰空调显示E4保护怎么处理 春兰空调出现e4是什么情况 ...我是北方的,不知道在南方都需要准备些什么? 大一要去辽宁上大学了要准备些什么呢?在那边生活要注意什么呢?例如在... 算命说我不过继就结婚晚是么意思? ...10点过肚子就饿得难受,我还在读书,不知道是怎么回事,求解答,谢谢... ...而且吃饱了的怎么不到10点肚子很饿,很想吃东西是不是有什么病_百度... 我晚餐已吃饱,但到10点左右又饿了要吃点东西,我以前没有吃夜宵的习惯... 白天不饿,,,到了晚上老想吃东西就是饿我是怎么了 dota中的鼠标指针(那只「手」)可以修改成其他的图案吗,比如,不死族的那个细细的手,。能不能详细点... 安装有16个3.5寸3T硬盘的电脑需要多大功率的电源? 台式主机这几个小电源启动线怎么插啊 如何改造双电源机箱 双电源启动线怎么用? cpu 和 显卡 使用两个电源供电 可以不使用同步线吗? 表示晚睡早起的幽默句子有哪些? 关于劝别人睡觉的句子? 如何幽默表达我要睡觉了 我先睡了幽默的说法 如何幽默的表示想睡觉 如何幽默表达我要睡觉了? 睡觉换个幽默的说法 睡觉怎么说幽默 睡觉换个幽默的说法是什么? VI画册一般怎么制作,具体步骤是什么,他和企业VI手册有什么区别?里面的素材图片是ps做出来的吗? 谁能告诉我这主板拆怎么拆 感觉好脆弱的样子 我要装内存条 型号 宏碁e5 572g 57vz 宏基e5-572g-57vz键盘有背光吗 浙二医院网上挂号如何查询是否挂上号了 我的我的电脑是E5 572g 57VZ 问下你们有加固态的吗 固态尺寸要买多大 然后硬盘支架是几寸 DOTA鼠标指针替换或自定义 我想把魔兽争霸3各族的鼠标指针都换成不死族的骷髅鼠标指针,该怎么做??? 亲,魔兽争霸各族鼠标指针麻烦分下下呗,谢谢 春节趣事作文1050字 DotA里有自带修改鼠标指针命令吗? 电脑里的鼠标指针可以变漂亮点儿么? 魔兽争霸3鼠标指针中,MDX格式的鼠标指针怎么用 2020年正月初八适合属兔和属猪结婚的日子吗吗? 明年的大年初八是多少号?结婚如何? 2020年正月初八和正月初九哪天干活好? 农历2020年正月初八适合办新房子酒吗? 2020年农历四月初八适合出门远行吗? 2020年农历五月初八宜嫁娶吗? 2020年正月初八,初九,初十哪天拆房好? 二0二一年正月初八结婚好不好 2020年腊八开业好吗? 2022年正月初八8:18适合开门? 哈根达斯蛋糕600克大约是几寸的? 2020年正月初八初九初十哪一天拆房好? 大家认为明年正月初八结婚,那天日子怎么样