在表单之间传递连接对象的最佳方法是什么?

背景:我正在重写一个使用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服务器中的设置我可以调整以在一段时间不活动后自动终止进程?

你会考虑在运行时内存中加密密码吗?

感谢您的任何帮助。 :)


不应该在表单之间传递连接对象。 基本上,使用SQL Server连接时的模式是创建连接,打开连接,执行操作,然后关闭连接。

为此,你应该有一个公共的静态方法,它会产生你将在Using语句中使用的SqlConnection,如下所示:

Using connection As SqlConnection = GetConnection
    ' Use connection here.

End Using

这应该防止进程在服务器上堆积。


您可以使用Using语句,它将在完成时关闭并处理连接。

Using _conn as New SqlConnection(<connstring>)
  _conn.Open()
  'get your data'

End Using

如果你没有调用.Close(),那可能是问题所在。


我同意卡斯帕。 如果您确实需要在页面之间共享对象以减少负载,那么您可以使用静态成员变量来执行此操作。 只要确保在执行最后一条语句时关闭连接。 您还可以创建一个连接作用域,可以在最后一个事务完成时处置。 如果您没有这方面的经验,那么请尽早打开并关闭您的连接,并且不要通过它。

我有一个Web应用程序,为了减少一些延迟,我使用了为DAL创建的范围,以便在子功能中存在调用时,它们可以使用相同的连接并且不会升级到MSDTC。 然而,这实际上只在交易系统中是必需的。

链接地址: http://www.djcxy.com/p/73419.html

上一篇: Best way to pass a connection object among forms?

下一篇: Method has the same erasure as another method in type