遍历数据库表行C#

时间:2014-01-29 13:05:42

标签: c# mysql

我在我的数据库中有一个名为学生的表,其中包含号码和姓名,地址.... 我有一个表格,我一次为一个学生加载所有信息,我有一个下一个按钮和一个后退按钮 如何迭代到mysql中的下一行(或前一行)(以便能够看到下一个学生的信息)?
我尝试使用主键(自动增量)进行迭代,当我想查看下一条记录时,我将1添加到id或减去1以查看上一条记录。
但如果删除一条记录,它将显示一条空记录。 你能指出我的方向吗?
我正在使用WinForms
对不起我的英文..

            string config = "server=localhost; userid = root; database = databaseName";
            MySqlConnection con = new MySqlConnection(config);

            MySqlDataReader reader = null;
            string query = "SELECT * FROM students WHERE id = " + id; //id is the primary Key (auto increment)

            MySqlCommand command = new MySqlCommand(query, con);
            con.Open();
            reader = command.ExecuteReader();

            while (reader.Read())
            {

                string studentName = (string)reader["studentName"];

                string studentNum = (string)reader["studentNum"];

                tbstudentName.Text = Convert.ToString(studentName);
                tbstudentNum.Text = Convert.ToString(studentNum);                   

                .....
            }
            con.Close();

4 个答案:

答案 0 :(得分:1)

要获得下一个,你可以写:

select * from students where id > @id
order by id asc
limit 1

并获得以前的

select * from students where id < @id
order by id desc
limit 1

答案 1 :(得分:0)

DataReader旨在快速一次性阅读。

如果要保存数据,则需要填充内存数组。 DataTable很好地实现了它。

答案 2 :(得分:0)

你需要考虑一点不同。

获取id+1你非常粗心..即使是身份,Id也可以是另一个值,你会得到一个例外。我想你不需要它。

您需要调整逻辑以使用top或在mysql,limit语句中返回行。

使用lambda使用.Take()Skip()方法很容易 你也可以使用limit参数来传递这个样本..你可以理解..

MySQL skip first 10 results

希望它有所帮助。

答案 3 :(得分:0)

每次要查看下一条记录时,都不应该调用数据库。尝试将所有数据读入List。

我不确定你在使用什么.. WinForms? WPF?

如果是WinForms,你需要做这样的事情。

    public class Student
    {//First create a class to hold your data in
      public string Name { get; set; }
      public string Num { get; set; }
    }

public class MyForm : Form
{
    int Index = 0;
    List<Student> FormData { get; set; }

    void GetData()
    {
    //This will hold all your data in memory so you do not have to make a database call each and every "iteration"
    List<Student> dbData = new List<Student>();

    string config = "server=localhost; userid = root; database = databaseName";
        MySqlConnection con = new MySqlConnection(config);

        MySqlDataReader reader = null;
        string query = "SELECT * FROM students";

        MySqlCommand command = new MySqlCommand(query, con);
        con.Open();
        reader = command.ExecuteReader();

        while (reader.Read())
        {
            Student newStudent = new Student();

            newStudent.Name = (string)reader["studentName"];

            newStudent.Num = (string)reader["studentNum"];
            //Add data to the list you created
            dbData.Add(newStudent);          

            .....
        }
        con.Close();

        //set the Form's list equal to the one you just populated
        this.FormData = dbData;
    }

    private void BindData()
    {
        //If winforms
        tbstudentName.Text = FormData[Index].Name;
        tbstudentNum.Text = FormData[Index].Num;

        //If wpf you will have to use view models and bind your data in your XAML but I am assuming you are using
        //winforms here.
    }

    private void NextRecord()
    {    //If you reached the end of the records then this will prevent IndexOutOfRange Exception
        if (Index < FormData.Count - 1)
        {
            Index++;
            BindData();
        }
    }

    private void PreviousRecord()
    {
        if (Index != 0)
        {
            Index--;
            BindData();
        }
    }
}

现在上述方案将使其快速运行;但是,有更好的方法可以在您需要更改数据时帮助您。我建议使用WinForms Binding。你可以在这里查看http://msdn.microsoft.com/en-us/library/c8aebh9k(v=vs.110).aspx