每次单击按钮时获取访问数据库的下一行表

本文关键字:一行 数据库 单击 按钮 访问 获取 | 更新日期: 2023-09-27 18:35:50

我正在尝试从访问数据库表中获取下一行,但我总是得到最后一行。

请指导我如何遍历所有行?

这是代码:

  protected void btn_clk(object sender, EventArgs e)
  {
      string constr = @"Provider=Microsoft.Jet.OLEDB.4.0; DataSource=C:'Users'Documents'databaseb.mdb";
      string cmdstr1 = "select count(*) from table";
      OleDbConnection con1 = new OleDbConnection(constr);
      OleDbCommand com1 = new OleDbCommand(cmdstr1, con1);
      con1.Open();
      int count = (int) com1.ExecuteScalar();
      int i = 2;
      while(i<=count)
      {
          string cmdstr = "select * from table where id = " + i;
          OleDbConnection con = new OleDbConnection(constr);
          OleDbCommand com = new OleDbCommand(cmdstr, con);
          con.Open();
          OleDbDataReader reader = com.ExecuteReader();
          reader.Read();
          label1.Text = String.Format("{0}", reader[1]);
          RadioButton1.Text = String.Format("{0}", reader[2]);
          RadioButton2.Text = String.Format("{0}", reader[3]);
          RadioButton3.Text = String.Format("{0}", reader[4]);
          RadioButton4.Text = String.Format("{0}", reader[5]);
          con.Close();
          i++;
      }
      con1.Close();
  }

每次单击按钮时获取访问数据库的下一行表

=必须在按钮单击之外:

string constr = @"Provider=Microsoft.Jet.OLEDB.4.0; Data     Source=C:'Users'Documents'databaseb.mdb";
     string cmdstr1 = "select count(*) from table";
     OleDbConnection con1 = new OleDbConnection(constr);
     OleDbCommand com1 = new OleDbCommand(cmdstr1, con1);
     con1.Open();
     int count = (int) com1.ExecuteScalar();
     int i = 2;
     con1.Close();

它必须在按钮点击内。你必须使i形式的属性

    if(i<=count)
{
     string cmdstr = "select * from table where id = " + i;
       OleDbConnection con = new OleDbConnection(constr);
       OleDbCommand com = new OleDbCommand(cmdstr, con);
       con.Open();
       OleDbDataReader reader = com.ExecuteReader();
       reader.Read();
       label1.Text = String.Format("{0}", reader[1]);
       RadioButton1.Text = String.Format("{0}", reader[2]);
       RadioButton2.Text = String.Format("{0}", reader[3]);
       RadioButton3.Text = String.Format("{0}", reader[4]);
       RadioButton4.Text = String.Format("{0}", reader[5]);
       con.Close();
       i++;     
}

但我认为它可能会改写为更多的美丽解决方案。

听起来你在追求类似的东西

private int _currentRecordId = -1;
...
string cmdStr = String.Format("SELECT * FROM Table WHERE id > {0} ORDER BY id LIMIT 1", _currentRecordId);
using (var con = new OleDbConnection(constr))
using (var com = new OleDbCommand(cmdStr, con))
{
    con.Open();
    using(var reader = com.ExecuteReader())
    {
        while (reader.Read())
        {
            _currentRecordId = reader.GetInt32(0); // whatever field the id column is
            // populate fields
        }
    }
}

在第一次调用时,这将检索 ID> -1的第一条记录。然后它记录此记录的任何 ID 是什么,因此在下一次调用时,它将采用大于该值的第一条记录,例如,如果第一条记录是 id 0那么它将找到的下一条记录是 1 等等......

当然,这只有在您有顺序 ID 的情况下才真正有效。

假设您的表不大(意味着它包含可管理的记录数量),您可以尝试在表单打开时加载所有内容并将该数据存储在数据表中。
此时,按钮中的逻辑应只是将指针前进到要显示的记录。

private DataTable data = null;
private int currentRecord = 0;
protected void form_load(object sender, EventArgs e)
{
     using(OleDbConnection con1 = new OleDbConnection(constr))
     using(OleDbCommand cmd = new OleDbCommand("select * from table", con1))
     {
         con1.Open();
         using(OleDbDataAdapter da = new OleDbDataAdapter(cmd))
         {
             data = new DataTable();
             da.Fill(data);
         }
         DisplayCurrentRecord();
    }
}
private void DisplayCurrentRecord()
{
    label1.Text = String.Format("{0}", data.Rows[currentRecord][1]);
    RadioButton1.Text = String.Format("{0}", data.Rows[currentRecord][2]);
    RadioButton2.Text = String.Format("{0}", data.Rows[currentRecord][3]);
    RadioButton3.Text = String.Format("{0}", data.Rows[currentRecord][4]);
    RadioButton4.Text = String.Format("{0}", data.Rows[currentRecord][5]);
}
protected void btn_clk(object sender, EventArgs e)
{
    if(currentRecord >= data.Rows.Count - 1)
        currentRecord = 0;
    else
        currentRecord++;
    DisplayCurrentRecord();
}

请记住,这只是一个例子。应将稳健检查应用于行(如果它们包含空值)以及返回的表中是否有行。此外,这是解决WinForm中数据绑定问题的穷人方法,因此也许您应该查看有关此主题的一些教程。

希望你的表没有真正命名Table,这个词是 Access 的保留关键字

只需删除for循环即可逐个获取记录

int lastFetchedRecordIndex=2;
protected void btn_clk(object sender, EventArgs e)
{
     string constr = @"Provider=Microsoft.Jet.OLEDB.4.0; Data     Source=C:'Users'Documents'databaseb.mdb";
     string cmdstr1 = "select count(*) from table";
     OleDbConnection con1 = new OleDbConnection(constr);
     OleDbCommand com1 = new OleDbCommand(cmdstr1, con1);
     con1.Open();
     int count = (int) com1.ExecuteScalar();
       string cmdstr = "select * from table where id = " + lastFetchedRecordIndex;
       OleDbConnection con = new OleDbConnection(constr);
       OleDbCommand com = new OleDbCommand(cmdstr, con);
       con.Open();
       OleDbDataReader reader = com.ExecuteReader();
       reader.Read();
       label1.Text = String.Format("{0}", reader[1]);
       RadioButton1.Text = String.Format("{0}", reader[2]);
       RadioButton2.Text = String.Format("{0}", reader[3]);
       RadioButton3.Text = String.Format("{0}", reader[4]);
       RadioButton4.Text = String.Format("{0}", reader[5]);
       con.Close();
       lastFetchedRecordIndex++;
     con1.Close();
  }