使用C#从MySQL读取数据写入TXT文件时出现"Invalid attempt to Read when reader is closed."错误的求助
解决"Invalid attempt to Read when reader is closed."错误及代码优化
我帮你梳理下代码里的问题,这个报错核心是误用了已关闭的DataReader,还有不少变量混淆的问题,具体来看:
主要错误点
- 误用已关闭的DataReader:第一个查询的
dr在bdcon.Close()后就已经失效了,但你在后面的查询里还在调用dr.Read(),这必然触发"reader is closed"的错误,而且后续查询你应该用对应的dr1、dr2、dr3来读取数据。 - 写入流对象混淆:比如第二个查询本该写入
sr_Quantidade,但你写的是sr_Produto;第三个查询要写入sr_Subtotal,结果还是用了sr_Produto,第四个同理,这会导致数据写入错误的文件。 - 数据库连接未关联:第四个
MySqlCommand cmd3没有传入bdcon连接对象,执行时会直接报错。 - 资源未正确释放:
StreamWriter、数据库连接和DataReader都没使用using语句管理,容易造成资源泄漏。
修正后的代码
我把代码优化了一下,用using自动管理资源,修正了所有变量混淆的问题,同时减少了不必要的连接开关操作:
// 用using管理数据库连接,自动释放资源 using (var bdcon = new MySqlConnection("你的数据库连接字符串")) { bdcon.Open(); // 写入produto.txt using (StreamWriter sr_Produto = new StreamWriter(@"C:\Enzo\PAP\PAP\Ficheiros\produto.txt", true)) { MySqlCommand cmd = new MySqlCommand("SELECT nome from produtos", bdcon); using (MySqlDataReader dr = cmd.ExecuteReader()) { // 如果有多条数据,建议把if改成while循环,读取所有记录 if (dr.Read()) { sr_Produto.Write(dr["nome"].ToString()); } } } // 写入quantidade.txt using (StreamWriter sr_Quantidade = new StreamWriter(@"C:\Enzo\PAP\PAP\Ficheiros\quantidade.txt", true)) { MySqlCommand cmd1 = new MySqlCommand("SELECT quantidade from produtos_pedidos", bdcon); using (MySqlDataReader dr1 = cmd1.ExecuteReader()) { if (dr1.Read()) { sr_Quantidade.Write(dr1["quantidade"].ToString()); } } } // 写入subtotal.txt using (StreamWriter sr_Subtotal = new StreamWriter(@"C:\Enzo\PAP\PAP\Ficheiros\subtotal.txt", true)) { MySqlCommand cmd2 = new MySqlCommand("SELECT subtotal from produtos_pedidos", bdcon); using (MySqlDataReader dr2 = cmd2.ExecuteReader()) { if (dr2.Read()) { sr_Subtotal.Write(dr2["subtotal"].ToString()); } } } // 写入valor.txt using (StreamWriter sr_Valor = new StreamWriter(@"C:\Enzo\PAP\PAP\Ficheiros\valor.txt", true)) { // 补上缺失的bdcon连接对象 MySqlCommand cmd3 = new MySqlCommand("SELECT valor from produtos", bdcon); using (MySqlDataReader dr3 = cmd3.ExecuteReader()) { if (dr3.Read()) { sr_Valor.Write(dr3["valor"].ToString()); } } } // 无需手动关闭连接,using会自动处理 }
额外提示
如果你的查询结果有多条数据,建议把if (dr.Read())改成while (dr.Read()),这样可以读取所有记录,而不是只读取第一条。
内容的提问来源于stack exchange,提问作者Enzo
相关产品推荐
相关产品推荐

