Ich war neugierig auf FileSystemWatcher()
, die in einem Kommentar von @Jimi erwähnt wurde.
Also schrieb ich ein grundlegendes Programm, das DataGridView nach jeder Änderung in der Access-DB-Datei aktualisiert. Ich habe es getestet und es funktioniert.
Klarstellungen:
1. Der Zweck dieses Codes ist die Demonstration der grundlegenden Prinzipien in Bezug auf OP Frage und benötigt einige Verbesserungen und Modularität.
2. SqlDependency ist eine viel bessere Lösung, wenn Sie SQL Server verwenden können.
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
Es gibt keine Möglichkeit mit einer Access-Datenbank. Sie müssten die Datenbank nur zeitweise abfragen. Sie können dies mit einer SQL Server-Datenbank tun, die die SqlDependency-Klasse verwendet, und andere "richtige" Datenbanken haben möglicherweise etwas Ähnliches, Access-Datenbanken sind jedoch nur Dateien. – jmcilhinney
Sie könnten eine ['FileSystemWatcher()'] (https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher (v = vs.110) .aspx) verwenden, um eine Benachrichtigung zu erhalten, wenn Zugriffsdatei wurde geändert. – Jimi
@Jimi Danke für Ihren Hinweis. Ich habe alles in Access-Datenbank getan und es wird mehr Zeit in Anspruch nehmen, wenn ich zur SQL-Server-Datenbank wechseln. FileSystemWatcher(), die gut klingen. Lassen Sie mich mehr darüber suchen :)) – Bruce