Ik ben een app aan het maken in VB.net met behulp van VS2005. Nu maak ik daarin een wizard die een nieuw project voor je creeert. Een nieuw project roept een SP aan op een SQL 2005 server en creeert een database. Dat gebeurt in twee stappen. Eerst de database aanmaken en dan een hoop SP en tabellen kopieren van een andere database. Deze twee stappen wil ik uitvoeren in een thread om ervoor te zorgen dat mijn UI (form) in VB niet hangt en een lopende progress bar laat zien.
Mijn mijn form ziet eruit als:
De eventhandler message zorgt ervoor dat connection events van de class DBconnection in de UI verwerkt worden die draait in de main thread:
De class db connection ziet er als volgt uit:
Na het testen van de DB connection (door te connecten) wil ik een nieuw process in de thread starten die de gehele db aanmaakt, stored procedures overzet etc. Ik snap dat dat in dezelfde thread zou kunnen waar in de DB connection maak, echter wil ik deze later uiteraard hergebruiken voor andere doeleinden.
Iemand enig idee hoe ik dit voor elkaar kan krijgen? Wellicht pak ik het e.a. helemaal verkeerd aan. Tips zijn welkom.
Mijn mijn form ziet eruit als:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| Imports System.Data.OleDb
Imports System.Threading
Public Class NewProject2
Private t As Thread
Private myDbConnection As dbConnection
Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext.Click
spNewProject.Visible = True
If txtNewProject.Text = "" Then
progress("You must provide a project name", 2, "A project name is required to create a new project database on the analysis server")
Exit Sub
End If
myDbConnection = New dbConnection()
AddHandler myDbConnection.message, AddressOf connMessage
AddHandler myDbConnection.connected, AddressOf createNewProject
t = New Thread(AddressOf myDbConnection.connect)
t.Start()
End Sub |
De eventhandler message zorgt ervoor dat connection events van de class DBconnection in de UI verwerkt worden die draait in de main thread:
code:
1
2
3
4
5
6
7
8
9
10
11
| Private Delegate Sub connMessageDelegate(ByVal status As String, ByVal code As Integer, ByVal detailStatus As String)
Private Sub connMessage(ByVal status As String, ByVal code As Integer, Optional ByVal detailStatus As String = "")
If Me.InvokeRequired Then
Dim args As Object() = {status, code, detailStatus}
Dim conn_message_delegate As connMessageDelegate
conn_message_delegate = AddressOf connMessage
Me.Invoke(conn_message_delegate, args)
Else
progress(status, code, detailStatus)
End If
End Sub |
De class db connection ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| Imports System.Data.OleDb
Public Class dbConnection
Public connstring As String = "Provider=SQLOLEDB;blablabla..."
Public Event message(ByVal status As String, ByVal code As Integer, ByVal detailStatus As String)
Public Event connected()
Public connection As OleDbConnection = New OleDbConnection(connstring)
Public Sub connect()
Try
RaiseEvent message("Trying to connect to database", 3, "")
connection.Open()
RaiseEvent message("Connection succeeded", 4, "")
RaiseEvent connected()
Catch ex As Exception
RaiseEvent message("Connection to database failed", 1, ex.Message)
End Try
End Sub
End Class |
Na het testen van de DB connection (door te connecten) wil ik een nieuw process in de thread starten die de gehele db aanmaakt, stored procedures overzet etc. Ik snap dat dat in dezelfde thread zou kunnen waar in de DB connection maak, echter wil ik deze later uiteraard hergebruiken voor andere doeleinden.
Iemand enig idee hoe ik dit voor elkaar kan krijgen? Wellicht pak ik het e.a. helemaal verkeerd aan. Tips zijn welkom.