2012-02-26 5 views
0

Я изучаю и пытаюсь научить себя VB.net кодирования и MySQL с этого сайта: http://www.vbmysql.com/articles/vbnet-mysql-tutorials/the-vbnet-mysql-tutorial-part-4MySQL Query обновляет базу данных, но не элемент управления DataGridView?

До сих пор я был успешным в захватывая все понятия и следуя по коду, однако, я столкнувшись с проблемой с запросом, я вызываю одну из своих кнопок. Я не получаю сообщение об ошибке - как и ожидалось, - и кажется, что запрос соответствующим образом обновляет базу данных (это потому, что я могу войти в базу данных и увидеть записи).

Проблема заключается в том, что, когда я вызываю метод .refresh на контроле DataGridView, содержание из базы данных не втягиваться.

Является ли это ошибка с запросом или что-то еще?

Вот весь код вида (frmMain):

Imports MySql.Data.MySqlClient 
Imports System.Data 


Public Class frmMain 

Private myConnString As String 
Private myUserID As Integer 

Public WriteOnly Property connectionString() As String 
    Set(ByVal value As String) 
     myConnString = value 
    End Set 
End Property 

Public WriteOnly Property UserID() As Integer 
    Set(ByVal value As Integer) 
     myUserID = value 
    End Set 
End Property 


Private Sub cmdRefresh_Click(sender As System.Object, e As System.EventArgs) Handles cmdRefresh.Click 

    Dim conn As New MySqlConnection 
    Dim myCommand As New MySqlCommand 
    Dim myAdapter As New MySqlDataAdapter 
    Dim myData As New DataTable 
    Dim SQL As String 

    SQL = "SELECT CONCAT(u.lastname, ', ', u.firstname) AS Name, s.message AS Message, " _ 
     & "DATE_FORMAT(e.timestamp, '%b %d %Y - %r') AS 'Date & Time', e.status AS Status " _ 
     & "FROM event e LEFT JOIN status s ON e.message_id = s.message_id, user u " _ 
     & "WHERE(e.user_id = u.user_id) " _ 
     & "AND event_id IN(" _ 
     & "SELECT MAX(e.event_id) " _ 
     & "FROM event e " _ 
     & "GROUP BY e.user_id) " _ 
     & "ORDER BY Name" 

    conn.ConnectionString = myConnString 

    Try 
     conn.Open() 
     Try 
      myCommand.Connection = conn 
      myCommand.CommandText = SQL 
      myAdapter.SelectCommand = myCommand 
      myAdapter.Fill(myData) 
      dgvStatus.DataSource = myData 
      dgvStatus.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells 
      dgvStatus.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells 
     Catch myerror As MySqlException 
      MessageBox.Show("There was an error reading from the database: " & vbCrLf & myerror.Message) 
     End Try 
    Catch myerror As MySqlException 
     MessageBox.Show("Error Connecting to Database: " & vbCrLf & myerror.Message) 
    Finally 
     If conn.State <> ConnectionState.Closed Then 
      conn.Close() 
     End If 
    End Try 

End Sub 

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

    cboStatus.Items.Add("In") 
    cboStatus.Items.Add("Out") 
    cboStatus.SelectedIndex = 0 

    dgvStatus.ReadOnly = True 

    Dim conn As New MySqlConnection 
    Dim myCommand As New MySqlCommand 
    Dim myAdapter As New MySqlDataAdapter 
    Dim myData As New DataTable 
    Dim SQL As String 

    SQL = "SELECT s.message_id, s.message " _ 
     & "FROM tutorial.status s " _ 
     & "WHERE user_id IS NULL and deleted = 'False'" 

    conn.ConnectionString = myConnString 

    Try 
     conn.Open() 
     Try 
      myCommand.Connection = conn 
      myCommand.CommandText = SQL 
      myAdapter.SelectCommand = myCommand 
      myAdapter.Fill(myData) 
      cboMessage.DataSource = myData 
      cboMessage.DisplayMember = "message" 
      cboMessage.ValueMember = "message_id" 
     Catch myerror As MySqlException 
      MessageBox.Show("There was an error reading from the database: " & vbCrLf & myerror.Message) 
     End Try 
    Catch myerror As MySqlException 
     MessageBox.Show("Error Connecting to Database: " & vbCrLf & myerror.Message) 
    Finally 
     If conn.State <> ConnectionState.Closed Then 
      conn.Close() 
     End If 
    End Try 


End Sub 

Private Sub cmdUpdate_Click(sender As System.Object, e As System.EventArgs) Handles cmdUpdate.Click 
    Dim conn As New MySqlConnection 
    Dim myCommand As New MySqlCommand 

    conn.ConnectionString = myConnString 

    myCommand.Connection = conn 
    myCommand.CommandText = "INSERT INTO event(user_id, message_id, timestamp, status, creator)" _ 
     & "VALUES(?UserID, ?MessageID, NOW(), ?Status, ?Creator);" 
    myCommand.Parameters.AddWithValue("?UserID", myUserID) 
    myCommand.Parameters.AddWithValue("?MessageID", cboMessage.SelectedValue) 
    myCommand.Parameters.AddWithValue("?Status", cboStatus.SelectedItem) 
    myCommand.Parameters.AddWithValue("?Creator", myUserID) 

    Try 
     conn.Open() 
     myCommand.ExecuteNonQuery() 
    Catch myerror As MySqlException 
     MessageBox.Show("There was an error updating the database: " & vbCrLf & myerror.Message) 
    Finally 
     If conn.State <> ConnectionState.Closed Then 
      conn.Close() 
     End If 
    End Try 

    cmdRefresh.PerformClick() 

End Sub 

End класса

ответ

0

Вы должны повторно связать источник данных. После того, как:

dgvStatus.DataSource = myData 

поставил

dgvStatus.ResetBindings() 
+0

Спасибо за отзыв. К сожалению, похоже, что в элементе управления отсутствует свойство .DataBind(). Единственное свойство, которое подходит близко, это .DataBindings(), но это вызывает ошибку. –

+0

Прошу прощения. Я думал о GridView, а не о DataGridView. Вместо этого попробуйте 'ResetBindings'. Обновленный ответ. – pete

+0

Спасибо за помощь, но я думаю, что я понял проблему. При создании экземпляра frmMain я забыл добавить строку, которая передала параметр UserID из формы входа. Мне не хватало этого: mainForm.UserID = UserID –

0

Оказывается, я решил свою собственную проблему. При создании моей основной формы (frmMain) я забыл одну строку кода, предназначенную для передачи параметра UserID из формы входа (frmLogin) в основную форму.

Я вставил следующую строку:

mainForm.UserID = UserID 

Еще раз спасибо.