Фон: Я переписываю приложение VB6, которое использует MS Access для хранения данных в том, что использует 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