阅读器关闭时尝试调用 HasRows/Read无效 解决思路

执行数据库操作时,出现阅读器关闭时尝试调用 HasRows无效或者阅读器关闭时尝试调用 Read无效的问题,

经查都是因为操作数据库时,数据库连接已关闭造成的。。

究其原因是因为使用了SqlDataReader返回数据库查询的数据。SqlDataReader的数据保存在数据库服务器中,

当数据库连接关闭/断开后自然无法再调用其方法访问数据库内容然后报错。

解决方法分2种思路:

1、数据库查询返回SqlDataReader时,保证数据库连接不断开。因此代码设计中就要避免使用Using去申请数据库连接对象,因在其作用域之外,连接会自动释放。

   此思路当访问量过大时,连接池面临暴涨的风险,需要着重考虑探讨;使用完SqlDataReader的方法访问完数据后需要关闭数据集,建议使用**SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)**来定义,CloseConnection定义“在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。”

2、使用DataSet等类型返回数据库查询数据,DataSet对象在一个暂存区(Cache)保留了数据库中查到的数据,将数据保存在本地内存中。此思路当访问数据量过大时又面临对本地内存的极大要求,需要权衡考虑。

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.OleDb; namespace Demo { public partial class deng_ru : Form { public deng_ru() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //数据库链接的配置 string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Administrator\Desktop\Demo\Test.accdb"; using (OleDbConnection connection = new OleDbConnection(connectionString)) { connection.Open(); //打开数据库连接 string username = textBox1.Text; //待验证的用户名 string password = textBox2.Text; //待验证的密码 // 获取需要查询的字段的值 string fieldValue = textBox1.Text; //查询语句,使用参数化查询,避免SQL注入攻击 string sql = "SELECT * FROM USERS WHERE User_ID=@username AND password=@password"; //使用using指令,确保在代码执行完毕后,command对象会被正确释放 using (OleDbCommand command = new OleDbCommand(sql, connection)) { //为查询语句中的参数赋值 command.Parameters.AddWithValue("@username", username); command.Parameters.AddWithValue("@password", password); //使用ExecuteReader方法执行查询语句,并将查询结果保存到reader对象中 using (OleDbDataReader reader = command.ExecuteReader()) { if (reader.HasRows) //登录成功的处理逻辑 { reader.Read(); //读取查询结果 //获取查询结果的第一个字段(ID)的值,即ID int id = reader.GetInt32(0); //获取名为student的窗口 deng_ru studentForm = Application.OpenForms["student"] as deng_ru; if (studentForm != null) //确保窗口存在 { studentForm.SetID(id); //调用窗口的SetID方法,将ID传递给它 } //从 登入界面 跳转到 学生界面 student xs = new student(); this.Hide(); xs.Show(); } else //登录失败的处理逻辑 { MessageBox.Show("登入失败,请重新输入!"); } } } } } } }C#报错找不到SetID的定义
最新发布
05-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值