2014-01-29 2 views
1

У меня в моей базе данных есть таблица со студентами, у которых есть номер и имя, адрес ....
У меня есть форма, где я загружаю всю информацию для одного ученика за один раз, а я нажмите кнопку «Назад» и кнопку «Назад».
Как я могу перебирать следующую строку (или предыдущую строку) в mysql (чтобы видеть информацию о следующем ученике)?
Я попытался использовать первичный ключ (auto increment) для итерации, и когда я хочу увидеть следующую запись, я добавляю 1 к id или вычитаю 1, чтобы увидеть предыдущую запись.
Но если одна запись удалена, она покажет пустую запись. Можете ли вы указать мне направление?
I'm с помощью WinForms
К сожалению о моем английском ..Итерировать строки таблицы базы данных строк C#

  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(); 

ответ

0

Вы не должны называть базу данных каждый раз, когда вы хотите, чтобы просмотреть следующую запись. Попробуйте прочитать все данные в списке.

Я не уверен, что вы используете .. 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

+0

Я пробовал ваше предложение, но я получаю сообщение об ошибке в этой строке, если (Index

+0

Можете ли вы обновить свой ответ всем кодом, который вы используете ? Вероятно, это означает, что ваш 'FormData' имеет значение null и никогда не был установлен. Я проверю это для вас. – Adrian

+0

Я был глупым ... Проблема решена. благодаря –

0

DataReader Предназначены для быстрых одноразового чтения.

Если вы хотите хранить данные, вам необходимо заполнить массивы памяти. DataTable отлично его использует.

0

Вам нужно будет подумать немного иначе.

Получение id+1 Вы очень небрежны. Даже идентификация, Идентификатор может быть другим значением, и вы получите Исключение .. Я полагаю, что вы этого не хотите.

Вам нужно будет настроить вашу логику для возврата строки с top или, в MySQL, limit заявление ..

Это будет легко с помощью лямбда использовать .Take() и Skip() методы ... Вы также можете использовать ограничить параметр, чтобы пройти через в этом примере .. вы можете понять ..

MySQL skip first 10 results

Надеется, что это помогает.

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 
Смежные вопросы