背景:我正在將使用MS Access進行數據存儲的VB6應用程序改寫爲使用VB.NET和MS SQL Server的應用程序。在表單之間傳遞連接對象的最佳方法是什麼?
我很好奇在我的應用程序中需要連接到數據庫的不同窗體之間傳遞連接的最佳方式。現在,我已經建立了一個類來管理連接字符串傳遞以安全的方式形式之間是:
Public Class LoginCredientials Private uname As String Private password_hash() As Byte = {0} Private server_name As String 'not used in access style databases Private dbname As String Private st As ServerType 'enum that would allow for different connections Private tdes As TripleDES 'encryption class to encrypt password in memory Public Sub New() uname = "" server_name = "" dbname = "" st = ServerType.stNotDefined End Sub Public Sub New(ByVal Username As String, _ ByVal Password As String, _ ByVal ServerName As String, _ ByVal DatabaseName As String, _ ByVal ServType As ServerType) tdes = New TripleDES uname = Username password_hash = tdes.Encrypt(Password) server_name = ServerName dbname = DatabaseName st = ServType tdes = Nothing End Sub Public ReadOnly Property Server_Type() As ServerType Get Return st End Get End Property Public ReadOnly Property CompanyName() As String Get Return dbname.Remove(0, 4) End Get End Property Public Property UserName() As String Get Return uname End Get Set(ByVal value As String) uname = value End Set End Property Public Property Password() As String Get tdes = New TripleDES Return tdes.Decrypt(password_hash) tdes = Nothing End Get Set(ByVal value As String) tdes = New TripleDES password_hash = tdes.Encrypt(value) tdes = Nothing End Set End Property Public Property ServerName() As String Get Return server_name End Get Set(ByVal value As String) server_name = value End Set End Property Public Property DatabaseName() As String Get Return dbname End Get Set(ByVal value As String) dbname = value End Set End Property Public Function GetConnectionString() As String Dim cstring As String = "" tdes = New TripleDES Select Case st Case ServerType.stSQLServer cstring = "User ID=" & uname & ";" & _ "Password=" & tdes.Decrypt(password_hash) & ";" & _ "Initial Catalog=" & dbname & ";" & _ "Data Source=" & server_name End Select tdes = Nothing Return cstring End Function End Class
我一直在傳遞給我的對象的引用到我的任何形式的需要所涉及的連接數據庫就像這樣:
'in the form declaration Private myLC As LoginCredientials Public Sub New(ByRef lc As LoginCredientials) InitializeComponent() myLC = lc End Sub
然後,我將創建一個新的連接對象,做了什麼,我需要做的,然後關閉了連接,並摧毀了連接對象。當我很早以前在ADO中使用VB6完成此操作時,連接創建的進程在連接對象被銷燬時被終止,但似乎不再是這種情況。現在,每次創建新的連接對象並連接到我的服務器時,都會創建一個新進程,然後在關閉連接時進入睡眠狀態。一段時間後,服務器將開始拒絕連接,直到我登錄並終止我的應用創建的所有進程。很明顯,這是不正確的,我想學習正確的方法。
簡單地通過引用(或在包裝類中)傳遞相同的連接對象在我的窗體之間傳遞,讓連接對象保持打開狀態會更好嗎?
什麼是正確的方式來關閉我的連接,以便我最終不會在我的SQL服務器上得到一堆睡眠進程?是否有SQL服務器中的設置我可以調整以在一段時間不活動後自動終止進程?
你會考慮加密運行時內存密碼嗎?
謝謝你的幫助。 :)
您有沒有考慮過使用Enterprise Library進行數據連接? http://www.codeplex.com/entlib – Walter 2010-01-14 15:54:07