调用Pear方法后Apple方法中SQL查询循环执行失败的问题排查
问题根源与解决方法
嘿,这个问题我一眼就看出端倪了——你的SQLDataReader没有被正确关闭/释放,导致数据库连接被独占锁死了!
具体原因分析
咱们看代码里的SQLDataReader myReader:第一次循环执行SQL查询后,myReader读完数据但没有被关闭。因为SQLDataReader在打开状态时会独占它关联的数据库连接,不允许同一连接上执行其他操作。当下一次循环再尝试执行SQL查询时,连接还被之前的myReader占着,新的查询根本跑不起来,自然不会弹出"bbb";而Pear()方法不涉及数据库操作,所以不受影响,每次都能正常弹出"ccc"。
解决方法(按推荐程度排序)
1. 用using语句自动管理资源(最推荐)
SQLDataReader实现了IDisposable接口,用using包裹它,代码块结束时会自动调用Dispose()方法,帮你关闭Reader并释放资源,完全不用手动操心:
public void Apple() { while (counta == 1) { // 注意:如果你的SqlConnection和SqlCommand也是手动创建的,最好也用using包裹 using(SqlConnection conn = new SqlConnection("你的连接字符串")) { conn.Open(); using(SqlCommand cmd = new SqlCommand("你的SQL查询语句", conn)) { using(SQLDataReader myReader = cmd.ExecuteReader()) { while (myReader.Read()) { MessageBox.Show("bbb"); } } // 这里自动关闭myReader } // 自动释放cmd } // 自动关闭并释放conn try { Pear(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } //some other simple code here } }
2. 手动关闭并释放Reader(不推荐,容易遗漏)
如果不想用using,一定要在读完数据后手动关闭Reader:
public void Apple() { while (counta == 1) { SQLDataReader myReader = null; try { //SQL query & connection code goes here ... while (myReader.Read()) { MessageBox.Show("bbb"); } } finally { // 不管有没有异常,都要关闭Reader if(myReader != null) { myReader.Close(); myReader.Dispose(); } // 别忘了也要关闭你的SqlConnection! } try { Pear(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } //some other simple code here } }
验证效果
修改后,每次循环结束SQLDataReader和数据库连接都会被正确释放,下一次循环就能正常执行SQL查询,"bbb"和"ccc"都会按预期弹出啦。
内容的提问来源于stack exchange,提问作者Shiraz S Kaderuppan
相关产品推荐
相关产品推荐

