You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:51:25