我覺得你在這裏談論的用戶會話管理。如果我正確地理解了你,你想停止任何一個用戶同時登錄到兩個實例,而不是一次打開兩個應用程序副本(顯然不同的用戶登錄到每個副本)。如果是這種情況,那麼實現非常基本的東西實際上並不困難。
當您的用戶登錄時,請檢查他們是否已在您的會話表中有記錄。如果沒有,則創建一個並使用會話標識發出該用戶。這個ID必須在所有操作中提供,以便您可以檢查它是否有效。到現在爲止還挺好。
如果該會話表中已經有一條記錄,則將其無效(刪除它,更改狀態 - 無論如何),以便舊會話標識無法使用併發出新會話標識。這樣,如果你的用戶已經有了一個打開的應用程序的登錄副本,然後開始另一個,第一個將不再實際做任何有用的事情(不要忘記告知用戶,無效的會話ID是他們爲什麼可以'不要做任何事情)。
很顯然,您需要堅持該會話ID爲應用程序的生命,但一切美好的愛情,不要把它放在一個全局變量:把它作爲構造的一部分,任何對象你實例化哪個將執行任何數據庫操作。如果你需要功能,甚至可以將它包裝在它自己的類中,並且變量或對象可以對你的主類是私有的。
例如,讓我們說你的主類是一個名爲frmMain形式產生一個登錄對話框,當它開始捕獲用戶名和密碼:
Public Class SessionManagerClass
_dal As New DAL
Private _sessionId As Int
Private _userName As String
Public Sub New(ByVal UserName As String, ByVal Password As string)
_sessionId = _dal.Login(UserName, Password)
End Sub
End Class
Partial Class frmMain
Private _session As SessionManagerClass
Public Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim loginForm As New dlgLogin
loginForm.ShowDialog()
_session = New SessionManagerClass(loginForm.UserName, loginForm.Password)
loginForm.Dispose()
End Sub
Public Sub btnLaunchChildForm_Click(ByVal sednder As Object, ByVal e As EventArgs) Handles btnLaunchChildForm.Click
Dim frm As New frmChildForm(_session)
frm.ShowDialog()
End Sub
End Class
Partial Class frmChildForm
_session As SessionManagerClass
_dal As New DAL
Public Sub New(ByVal Session As SessionManagerClass)
_session = Session
End Sub
Private Sub DoSomething()
If _dal.SaveValues(_session.SessionId, Value1, Value2, Value3) Then
'All Good
Else
'Something went wrong. Maybe invalid session ID or perhaps you didn't validate your data. Whatever. Handle the problem if you can.
End If
End Sub
End Class
這是沒有辦法運行的代碼,只是一個例子你可能會怎麼做才能讓你開始。
請問您可以添加一些代碼?關閉表格代碼,加載 – Hoh 2014-09-11 10:26:14
程序的確切名稱是什麼(將在任務管理器中提供)? – 2014-09-11 10:58:13
@Hoh普通的SQL語句從離線在線更改用戶狀態的形式加載和形式關閉 – user3290334 2014-09-11 13:25:11