2017-12-30 46 views
1

VB.Net을 사용하여 응용 프로그램을 프로그래밍하고 있습니다. 내 프로젝트는 Excel 파일에서 셀을 클릭하고 매크로를 실행하면 셀에서 Access로 데이터를 전송합니다. 내 애플 리케이션은 단지 데이터베이스를 보여줍니다.VB.Net에서 이벤트가 업데이트 될 때

하지만 내 문제는 내가 액세스 할 때 레코드가 변경되거나 (Access에서 레코드가 업데이트되거나 삽입 될 때) 내 VB.Net 앱 (새로 고침 앱)에서 트리거 할 수 있거나 액세스 할 때 무언가를 할 수있는 이벤트가있는 것입니다. 변경되었습니다?

+0

Access 데이터베이스에는 방법이 없습니다. 데이터베이스를 간헐적으로 폴링하면됩니다. SqlDependency 클래스를 사용하여 SQL Server 데이터베이스에서이 작업을 수행 할 수 있으며 다른 "적절한"데이터베이스는 비슷한 것을 가질 수 있지만 Access 데이터베이스는 단지 파일 일뿐입니다. – jmcilhinney

+1

[FileSystemWatcher()'] (https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher (v = vs.110) .aspx)를 사용하여 액세스 파일이 수정되었습니다. – Jimi

+1

@ 지미 당신의 힌트를 가져 주셔서 감사합니다. 나는 액세스 데이터베이스에서 모든 작업을 수행했으며 SQL 서버 데이터베이스로 변경할 경우 더 많은 시간이 걸릴 것입니다. FileSystemWatcher() 좋은 소리. 그것에 대해 더 자세히 검색하자 :)) – Bruce

답변

3

나는 약에 대해 궁금 해서요 @ Jimi의 의견에 언급되었습니다.
그래서 나는 액세스 db 파일을 변경할 때마다 DataGridView를 업데이트하는 기본 프로그램을 작성했습니다. 나는 그것과 그것의 작동을 시험했다.

설명 :
1.이 코드의 목적은 OP 질문과 관련하여 기본 원칙을 입증하기위한 것이며 개선점과 모듈성이 필요합니다.
2. SQL Server를 사용할 수 있다면 SqlDependency가 훨씬 더 나은 솔루션입니다.

Imports System.IO 
Imports System.Data.OleDb 
Public Class Form1 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     UpdateDgv() 
     watch() 
    End Sub 


    Private Sub UpdateDgv() 
     DataGridView1.DataSource = Nothing 
     DataGridView1.DataSource = GetDatatableFromAccess() 
    End Sub 

    Private Sub UpdateDgvThread() 
     RemoveHandler watcher.Changed, AddressOf OnChanged 
     DataGridView1.Invoke(New Action(AddressOf UpdateDgv)) 
     AddHandler watcher.Changed, AddressOf OnChanged 
    End Sub 

    Public watcher As FileSystemWatcher 

    Private Sub watch() 
     watcher = New FileSystemWatcher() 
     watcher.Path = "c:\Users\john\Desktop\Desktop 01-04-2017\" 
     watcher.NotifyFilter = NotifyFilters.LastWrite 
     watcher.Filter = "*.*" 
     AddHandler watcher.Changed, AddressOf OnChanged 
     watcher.EnableRaisingEvents = True 
    End Sub 


    Private Sub OnChanged(ByVal source As Object, ByVal e As FileSystemEventArgs) 
     Debug.WriteLine("file was changed") 
     ' update datagridview 
     Dim t1 As New System.Threading.Thread(AddressOf UpdateDgvThread) 
     t1.Start() 
    End Sub 

    Public Function GetDatatableFromAccess() As DataTable 

     Dim connString As String = 
    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\john\Desktop\Desktop 01-04-2017\Database11.accdb" 

     Dim results As New DataTable() 

     Using conn As New OleDbConnection(connString) 
      Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM TestTable", conn) 
      conn.Open() 
      Dim adapter As New OleDbDataAdapter(cmd) 
      adapter.Fill(results) 
     End Using 

     Return results 
    End Function 

End Class 
+1

이것은 매우 유용한 예제입니다. 나는 시험을 보았고 나를 위해 일했다. 그러나, 당신과 jmcilhinney가 옳았어요, 제 생각에 이것은 제 문제에 대한 일시적인 해결책 일뿐입니다. 미래에, 나는 SQL 데이터베이스로 변경해야만한다고 생각합니다 :)) – Bruce

+0

다행스럽게도 (- : – jonathana