C# SqlDataReader点击下一条按钮时文本框仅显示最后一条记录
问题根因
当前代码点击按钮只显示最后一条记录,是因为逻辑存在两个核心问题:
- 每次触发点击事件都会重新建立连接、执行全表查询,读取指针永远从结果集第一行开始
- 用
while (dr.Read())做了全量循环遍历,每次循环都会覆盖文本框的赋值,循环执行完成后文本框自然保留最后一条记录的值,完全没有保留逐行读取的位置。
修复方案
核心调整思路:将数据库连接、SqlDataReader的声明提升到窗体级全局作用域,脱离按钮点击事件的短生命周期;每次点击按钮只执行一次Read()方法让读取指针下移一行,而非一次性循环完所有记录。
实现步骤
- 在窗体类内部声明窗体级变量,持有数据库连接和DataReader实例,避免每次点击事件触发时重置状态
- 首次点击按钮时再打开连接、执行查询初始化DataReader
- 移除
while循环,每次点击仅调用一次dr.Read()读取单行数据赋值给文本框 - 增加末尾判断逻辑,当
Read()返回false时说明已遍历完所有记录,此时释放数据库相关资源,支持下次重新从头遍历
修正后完整代码
// 窗体级全局变量,生命周期与窗体一致 private SqlConnection con = new SqlConnection("替换为你实际的数据库连接字符串"); private SqlDataReader dr = null; private void cmdNext_Click(object sender, EventArgs e) { // 首次点击时初始化查询 if (dr == null) { con.Open(); SqlCommand cmd = new SqlCommand("select * from stu", con); dr = cmd.ExecuteReader(); } // 每次点击仅读取一行记录 if (dr.Read()) { textBox1.Text = dr["st_id"].ToString(); textBox2.Text = dr["st_name"].ToString(); textBox3.Text = dr["st_age"].ToString(); } else { // 遍历到末尾,释放资源 MessageBox.Show("已到达最后一条记录"); dr.Close(); con.Close(); // 重置状态,支持下次点击重新从头遍历 dr = null; } }
注意事项
SqlDataReader是向前只读的读取器,Read()方法每调用一次会将指针向下移动一行,返回true表示存在可读行,返回false表示已经到达结果集末尾- 不要在每次点击事件中重复创建连接、执行查询,否则读取指针会永远重置到第一行,无法实现顺序导航
- 遍历完成后必须及时关闭DataReader和数据库连接,避免数据库连接泄漏。
内容的提问来源于stack exchange,提问作者Saleem
相关产品推荐
相关产品推荐

