【问题标题】:how to keep a odbc connection open in vb.net如何在 vb.net 中保持 odbc 连接打开
【发布时间】:2014-08-15 18:32:02
【问题描述】:

我正在尝试连接到数据库并为数据库中的任何数量的用户活动/查询保持连接打开。目前我有一个连接可以打开和关闭任何查询(保存,更新等......),每次用户保存等时都需要登录到后端......有没有办法简单地连接和离开连接打开,因此在运行查询时不会因为登录过程而出现延迟?这是我正在使用的:

    Private sConStrFormat As String = "Provider=TDOLEDB;Data Source=TDDEV;Persist Security Info=True;User ID={0};Password={1};Default Database=bcpm_ddbo;Session Mode=ANSI;"


   Private Sub cmdsave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdsave.Click


        Dim sSQL As String
        Dim sConStr As String

        Dim user As String
        Dim pass As String
        user = txtuser.Text
        pass = txtpass.Text

        Dim UserName As String = user
        Dim Password As String = pass

        sConStr = String.Format(sConStrFormat, UserName, Password)
        Using Con As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection(sConStr)
            Con.Open()
            sSQL = "INSERT INTO LTC_FBS (CLM_NUM) VALUES ('" & Me.txtClaim.Text & "')"
            Dim cmdins As New System.Data.OleDb.OleDbCommand(sSQL, Con)
            cmdins.ExecuteNonQuery()

            Con.Close()

        End Using


    End Sub

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    .Net 会自动为您维护一个connection poolAccording to MSDN,当您在 Connection 框架上调用 Close()

    释放与 连接池,或关闭 如果连接池是连接 禁用

    【讨论】:

    • 所以你是说只要我不关闭连接,它就会保持打开状态,我可以在应用程序的任何地方使用 SQL = "....."?
    • 我的意思是你的app第一次使用时,第一条SQL语句会连接到服务器并执行。当您调用 close 时,它​​实际上并没有关闭数据库连接,它只是将其释放到连接池。执行的第二个 SQL 语句(假设相同的连接字符串)将重用池中的连接,而无需先打开它。如果您的数据库有办法对此进行监控,您会发现连接实际上是不断来来去去的。
    • 所以请保持与现在完全相同的编码方式。您可以在此处阅读有关连接池以及如何对其进行调整的更多信息:aspalliance.com/1099_Understanding_Connection_Pooling_in_NET.2
    • 所以我仍然可以调用 Close() 并且它会保持池化?所以在那之后的任何延迟都只是 SQL,而不是登录等......?
    • 你是对的!在第一次连接后,应用程序打开,我再次运行,它是即时的......谢谢你的澄清!
    【解决方案2】:

    在 vb.net 4.5 中执行以下操作:

    在类定义器之后的最上方:

        Public Shared conn As OdbcConnection
    

    然后,在要使用连接的 subs 中使用此行:

        If conn Is Nothing Then conn = New OdbcConnection(<your_connection_string>): conn.Open()
    

    然后New OdbcCommand 将使用现有连接而不打开新连接。在您确定已完成连接之前,请勿关闭脚本中的连接(_Shutdown 是一个好地方,您可以开始了。

    这也解决了 MySQL 在不断打开新连接导致最大连接错误时出现的问题。

    【讨论】:

      【解决方案3】:

      不要在 using 语句中定义“con”,而是在上面将其定义为静态变量。调用该函数时,您可以查看“Con”是否已被调用。如果没有,则构建连接字符串并设置 Con = New OleDBConnection,然后打开它。由于它是一个静态变量,因此它将在下次调用时保留其值。检查它不是什么,然后立即使用它。确保您没有在例程中调用 close,否则连接将不会保持打开状态。

      【讨论】: