2015-05-21 2 views
0

Я делаю приложение в коде vb.net, используя визуальную базовую среду 2010, и у меня есть небольшая проблема с datagridview. Для получения дополнительной информации я подключил базу данных postgresql, используя разъем odbc, и он работает нормально. Я могу легко вставлять, обновлять, удалять данные, но после обновления и только после запроса на обновление datagridview отображает все мои данные, но обновленная строка автоматически перемещается в последнюю позицию. Зачем ? если я посмотрю свою базу данных в PGadmin 3, у меня нет этой проблемы, это покажет мне отсортированные по возрастанию строки. Лично я искал решения, но я нашел что-нибудь. Я объясню свою ситуацию с скриншотом:Datagridview: строка перемещается после обновления, почему?

Вот мое заявление, когда форма нагрузка: первого изображения => https://drive.google.com/file/d/0B_Lx61Af8AuUNUs4TDlWMnBIblE/view?usp=sharing

Как вы можете видеть строки сортируются по возрастанию. Вот код «ACCUEIL» форме:

Imports System.Data.Odbc 

Public Class accueil 

    Dim database As String = "Driver={PostgreSQL Unicode};Server=localhost;Port=5432;Database=formation;Uid=postgres;Pwd=test;" 

    Dim CON As OdbcConnection 
    Dim CMD As OdbcCommand 
    Dim RD As OdbcDataReader 
    Dim stock_id As Integer 


    ''''Fonction pour l'affichage pour SessionFormation 
    Function SessionFormationReadData() As Boolean 

     Try 
      CON = New OdbcConnection(database) 
      CON.Open() 

     Catch ex As Exception 
      MessageBox.Show(ex.Message) 
      CON.Close() 
      End 

      Exit Function 
     End Try 

     CMD = CON.CreateCommand() 
     CMD.CommandText = "SELECT * FROM sessionformation;" 
     RD = CMD.ExecuteReader() 

     DataGridView1.Columns.Clear() 
     DataGridView1.Rows.Clear() 



     If (RD.Read()) Then 

      DataGridView1.ColumnCount = 4 

      DataGridView1.Columns(0).Name = "N° de Session" 
      'DataGridView1.Columns(0).ValueType = GetType(Integer) 

      DataGridView1.Columns(1).Name = "Test" 
      'DataGridView1.Columns(1).ValueType = GetType(String) 

      DataGridView1.Columns(2).Name = "Date de début" 
      'DataGridView1.Columns(2).ValueType = GetType(DateTime) 

      DataGridView1.Columns(3).Name = "Date de fin" 
      'DataGridView1.Columns(3).ValueType = GetType(DateTime) 


      DataGridView1.Rows.Add(RD("id_session"), RD("type"), RD("date_debut"), RD("date_fin")) 


      While (RD.Read()) 

       DataGridView1.Rows.Add(RD("id_session"), RD("type"), RD("date_debut"), RD("date_fin")) 


      End While 

      'DataGridView1.Sort(DataGridView1.Columns(0), System.ComponentModel.ListSortDirection.Ascending) 

      RD.Close() 
      CON.Close() 
      Return True 

     Else 

      RD.Close() 
      CON.Close() 
      Return False 

     End If 

    End Function 


    ''''Fonction pour supprimer une session 
    Public Sub SessionFormationDeleteData() 

     stock_id = DataGridView1.CurrentRow.Cells(0).Value 

     Try 
      CON = New OdbcConnection(database) 
      CON.Open() 
      CMD = CON.CreateCommand() 
      CMD.CommandText = "DELETE FROM SessionFormation WHERE ID_session= '" & stock_id & "';" 
      CMD.ExecuteNonQuery() 
      CON.Close() 

     Catch ex As Exception 
      MessageBox.Show(ex.Message) 
      CON.Close() 
     End Try 


    End Sub 


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

     Call SessionFormationReadData() 


    End Sub 


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

     ajouter.Show() 

    End Sub 


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 

     modifier.Show() 

    End Sub 


    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 

     Call SessionFormationDeleteData() 
     Call SessionFormationReadData() 

    End Sub 


End Class 

Теперь я хочу сделать обновление до первой строки, поэтому я выбираю его, и я нажмите на кнопку «модификатор». Это изображение сверху здесь =>https://drive.google.com/file/d/0B_Lx61Af8AuUNW45dzFmWHMwcG8/view?usp=sharing

Вот код «модификатор» формы:

Imports System.Data.Odbc 
Public Class modifier 

    Dim database As String = "Driver={PostgreSQL Unicode};Server=localhost;Port=5432;Database=formation;Uid=postgres;Pwd=test;" 

    Dim CON As OdbcConnection 
    Dim CMD As OdbcCommand 


    ''''Affiche les données des cellules de la ligne sélection sur HOME dans les champs respectifs 
    Private Sub modifier_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

     TextBox1.Text = accueil.DataGridView1.CurrentRow.Cells(1).Value.ToString() 
     DateTimePicker1.Text = accueil.DataGridView1.CurrentRow.Cells(2).Value.ToString() 
     DateTimePicker2.Text = accueil.DataGridView1.CurrentRow.Cells(3).Value.ToString() 

    End Sub 


    ''''Fonction pour mettre à jour la base de donnée suite à une modification 
    Public Sub SessionFormationUpdateData() 
     Dim stock_id As Integer 

     stock_id = accueil.DataGridView1.CurrentRow.Cells(0).Value 

     Try 
      CON = New OdbcConnection(database) 
      CON.Open() 
      CMD = CON.CreateCommand() 
      CMD.CommandText = "update sessionformation set type= '" + TextBox1.Text.ToString() + "', date_debut='" + DateTimePicker1.Value + "', date_fin='" + DateTimePicker2.Value + "' where id_session= '" & stock_id & "';" 
      CMD.ExecuteNonQuery() 
      CON.Close() 

     Catch ex As Exception 
      MessageBox.Show(ex.Message) 
      CON.Close() 
     End Try 


    End Sub 


    ''''Bouton "Ok" pour valider les modifications et rafraichir l'affichage sur "HOME" 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

     Call SessionFormationUpdateData() 

     Close() 

     Call accueil.SessionFormationReadData() 


    End Sub 


    ''''Fermeture de la fenêtre 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 

     Close() 

    End Sub 

End Class 

На «модификатором», когда я нажимаю на кнопку «ОК», то «модификатор» form close и в форме «accueil» datagridview обновить все данные базы данных. И посмотрите результаты на изображении снизу со второй ссылки. Строка с идентификатором «18» перемещается в последнюю позицию на datagridview. Я не знаю почему.

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

+0

Возможный дубликат [Почему результаты запроса SQL не возвращаются в ожидаемом порядке?] (Http://stackoverflow.com/questions/10999913/why-do-results-from-a-sql-query -not-come-back-in-the-order-i-expect) – Paolo

+0

Спасибо за ответ, но я не думаю, что это проблема. Потому что это только в приложении vb.net есть эта проблема. Когда я использую pgadmin 3 для просмотра моих таблиц моей базы данных, у меня нет этой проблемы. Все данные находятся в хорошем состоянии. – dimstheonlyone

ответ

0

это ожидаемое поведение как заявлено postgresql documentation:

8.If заказ по п указано, возвращенные строки сортируются в определенном порядке. Если ORDER BY не задан, строки возвращаются в любом порядке, который система находит быстрее всего.

, если вы не указали пункт order by то сервер может изменить порядок в любой перспективе (оценка за «быстро производить» может включать в себя загрузку системы, доступ к диску, погоду, время суток,. ..).

также следует учитывать, что это по дизайну (это не недостаток) или поведение, характерное для postgresql, это нормальное и ожидаемое поведение для многих СУБД из-за relational model.

Если вам нужен конкретный заказ набора результатов или вы хотите надежный порядок этого набора, тогда вы должны использовать предложение order by.

+0

Хорошо. Я использую порядок заказа, и он работает очень хорошо. – dimstheonlyone

+0

большое спасибо – dimstheonlyone

+0

добро пожаловать.если вы найдете ответ полезным, пожалуйста, повысьте его или отметьте как ответ. – Paolo

Смежные вопросы