2017-12-30 26 views
1

Ich programmiere eine Anwendung mit VB.Net. Mein Projekt ist, wenn ich auf Zelle auf Excel-Datei klicke und Makro laufe, sendet es Daten von Zelle zu Zugang. Meine App zeigt nur die Datenbank an.Ereignis in VB.Net, wenn Access aktualisiert

Aber mein Problem ist, wie kann ich in meiner VB.Net App auslösen (App aktualisieren), wenn ein Datensatz in Access geändert wird (Datensätze in Access entweder aktualisiert oder eingefügt), oder gibt es ein Ereignis, das etwas bei Access tun wird ist geändert?

+0

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

+1

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

+1

@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

Antwort

3

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 
+1

Dies ist ein sehr hilfreiches Beispiel. Ich habe es getestet und es hat auch für mich funktioniert. Sie und Jmcilhinney hatten jedoch recht, ich denke, das ist nur eine vorübergehende Lösung für mein Problem. Für die Zukunft, ich denke, ich musste auf SQL-Datenbank ändern :)) – Bruce

+0

froh, ich könnte helfen (-: – jonathana

Verwandte Themen