2011-12-14 3 views
0

이것은 매우 간단합니다. 나는 바보가되어야합니다!데이터 소스의 변경 사항 만있는 ado.net 데이터 세트 채우기

로그 레코드에 시간이 몇 번 기록되는 간단한 액세스 데이터베이스가 있습니다.

데이터가 도착하면 그 데이터를 표시하는 DataGridView를 만들려고합니다.

"솔루션"은 간단합니다.

사용자가보기 -> 데이터베이스에서 읽기 (데이터 테이블 채우기) ->보기를 클릭 할 때.

내가 꿈꾸지는 않았지만, 완전히 차선책 인 경우 기능적이었습니다.

그러나 내 "솔루션"은 쓰레기입니다. fill을 사용하면 이미 데이터베이스에있는 모든 레코드가 그려집니다 (이미 화면에 599 개가 있더라도).

정말, 일단 데이터 테이블을 한 번 채우고 도착한대로 (또는 필요할 경우 클릭 할 때) 새 레코드를 추가하기 만하면됩니다.

ID 열을 숨기고 (이름이 DateTimeStamp 인) 열의 머리글을 TimeStamp로 변경하는 다른 방법 (너무 자주는 아니지만)을 설명 할 수있는 경우 보너스 포인트를 지정하십시오.

Public Class FormMain 

    Shared dataAdapter As OleDbDataAdapter 
    Shared logTable As New DataTable("log") 
    Shared commandBuilder As OleDbCommandBuilder 
    Shared queryString As String = "SELECT * FROM log" 
    Shared bindingSource As New BindingSource 

    Private Sub FormServerBridge_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Try 
      ConfigureDataSet() 
      ConfigureBindingSource() 
      ConfigureDataView() 
     Catch ex As Exception 
      ' FIXME: Helpful for debugging purposes but awful for the end-user. 
      MessageBox.Show(ex.Message) 
     End Try 
    End Sub 

    Private Sub ConfigureDataSet() 
     dataAdapter = New OleDbDataAdapter(queryString, _Config.ConnectionString) 
     commandBuilder = New OleDbCommandBuilder(dataAdapter) 
     commandBuilder.GetUpdateCommand() 

     dataAdapter.Fill(logTable) 

     With logTable 
      .Locale = System.Globalization.CultureInfo.InvariantCulture 
      .PrimaryKey = New DataColumn() {logTable.Columns("ID")} 
     End With 
    End Sub 

    Private Sub ConfigureBindingSource() 
     With bindingSource 
      .DataSource = logTable 
     End With 
    End Sub 

    Private Sub ConfigureDataView() 
     With DataGridView 
      .DataSource = bindingSource 
     End With 
    End Sub 

    Private Sub DataGridView_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView.Click 
     UpdateUI() 
    End Sub 

    Sub UpdateUI() 
     dataAdapter.Fill(logTable) 
    End Sub 

    Private Sub DataGridView_DataBindingComplete(ByVal sender As Object, ByVal e As DataGridViewBindingCompleteEventArgs) Handles DataGridView.DataBindingComplete 

     ' FIXME: This code gets run as many times as there are rows after dataAdapter.Fill! 

     With DataGridView 
      .Columns("ID").Visible = False 

      .Columns(1).HeaderText = "Timestamp" 

      .Columns(1).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells 
      .Columns(2).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells 
      .Columns(3).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill 
     End With 

    End Sub 
End Class 

p.s. 웹 사이트와 서적에 대한 링크는 올바른 MSDN 페이지에서도 인정 될 것입니다. (어디 있는지 알고 있으면 필독하기가 불편하다는 것을 인정하고 정기적으로 분실 함을 인정합니다.)

답변

0

가정 사용자의 ID를 순차적, 나는이 접근 할 방법은 다음과 같습니다

1) 기록은 사용자 프레스 볼 때, 단지 그 ID가 큰 기록을 얻을)

2를 마지막으로 검색 한 ID 마지막 한 레코드보다

3) 레코드를 새 데이터 테이블로 가져온 다음 기존 데이터 세트와 병합하십시오. 그 정말 분명,

Public Class FormMain 

    Shared logTable As DataTable 
    Shared bindingSource As New BindingSource 

    Private m_wLastID As Integer 

    Private Sub FormServerBridge_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 
     Try 
      ConfigureDataSet() 
      ConfigureBindingSource() 
      ConfigureDataView() 
     Catch ex As Exception 
      ' FIXME: Helpful for debugging purposes but awful for the end-user. 
      MessageBox.Show(ex.Message) 
     End Try 
    End Sub 

    Private Sub ConfigureDataSet() 

     Dim queryString As String 

     queryString = "SELECT * FROM log WHERE ID > " & m_wLastID.ToString & " ORDER BY ID" 

     Using dataAdapter As New OleDbDataAdapter(queryString, _Config.ConnectionString) 
      Using commandBuilder As New OleDbCommandBuilder(dataAdapter) 
       Dim oDataTable As New DataTable("log") 

       commandBuilder.GetUpdateCommand() 

       dataAdapter.Fill(oDataTable) 

       With oDataTable 
        .Locale = System.Globalization.CultureInfo.InvariantCulture 
        .PrimaryKey = New DataColumn() {.Columns("ID")} 
       End With 

       ' Record the last id 
       If oDataTable.Rows.Count <> 0 Then 
        m_wLastID = CInt(oDataTable.Rows(oDataTable.Rows.Count - 1)("ID")) 
       End If 

       If logTable Is Nothing Then 
        logTable = oDataTable 
       Else 
        logTable.Merge(oDataTable, True) 
        logTable.AcceptChanges() 
       End If 
      End Using 
     End Using 
    End Sub 

    Sub UpdateUI() 
     ConfigureDataSet() 
    End Sub 

    ' Rest of the form code here 
+0

대 : 여기

내가 (단지 변경된 정보 포함) 변화를 만들 것입니다 방법이다. oDataTable에서 o는 무엇을 나타냅니다. 또한, m_wLastID (m_w, 구체적으로)의 의미는 무엇입니까? – bluekeys

+0

@dsjbirch : 죄송합니다. 그 사람들은 오래 전에 습관적으로 죽습니다. 나는 객체를 위해 o를 사용하고 m_는 모듈 - 레벨 변수를위한 것이고 w는 정수를위한 것이다. 데이터가 어디에서 왔으며 개인 습관인지 한눈에 확인할 수 있습니다. –

+0

'{logTable.Columns ("ID")}'를 {oDataTable.Columns ("ID")}'로 편집 할 수 있습니까? 그 외에, 나는 복사하고 붙여 넣었고 나는 가기 좋다. 가장 확실하게 받아 들여지는 답변, 큰 큰 감사와 좋은 밤! – bluekeys