【问题标题】:VB.Net OleDb Connecting to Previous SourceVB.Net OleDb 连接到以前的源
【发布时间】:2021-08-14 13:48:59
【问题描述】:

我有一个简单的应用程序,它使用同一个 OleDb 提供程序从两个不同的来源检索数据。如果我单击 btnSource1 它应该从 url1 检索数据,如果我单击 btnSource2 它应该从 url2 检索数据。 ConnectionString 中的每个源都有不同的数据源、密码和用户 ID。

第一个连接工作正常,但每当我从一个源切换到另一个源时,连接都会失败,登录无效。然后,如果我进行第二次尝试,第二次尝试可以正常工作并查询正确的来源。每次我切换来源时,第一次尝试都会失败,但所有后续尝试都会成功。

调试显示正在使用的正确连接字符串,但它肯定使用的是上一次尝试的连接。我错过了什么明显的东西吗?

Private Sub btnSource1_Click(sender As Object, e As EventArgs) Handles btnSource1.Click

    Dim conn As New OleDbConnection("Provider=myprovider;Data Source=url1;Password=password1;User ID=userid1")
    Dim cmd As New OleDbCommand("select count(*) as num from table", conn)
    Dim dt As New DataTable
    Dim da As New OleDbDataAdapter(cmd)

    Try
        da.Fill(dt)
        dgvResults.DataSource = dt
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally
        conn.Close()
        conn.Dispose()
    End Try

End Sub

Private Sub btnSource2_Click(sender As Object, e As EventArgs) Handles btnSource2.Click

    Dim conn As New OleDbConnection("Provider=myprovider;Data Source=url2;Password=password2;User ID=userid2")
    Dim cmd As New OleDbCommand("select count(*) as num from table", conn)
    Dim dt As New DataTable
    Dim da As New OleDbDataAdapter(cmd)
    Try
        da.Fill(dt)
        dgvResults.DataSource = dt
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally
        conn.Close()
        conn.Dispose()
    End Try

End Sub

编辑:

根据 cmets 中的建议,我重新配置了一些东西以使用 Using 语句。问题依然存在。

Sub btnSource1_Click(sender As Object, e As EventArgs) Handles btnSource1.Click

    Dim cs As String = "Provider=myprovider;Data Source=url1;Password=password1;User ID=userid1"
    Dim dt As New DataTable

    Using cn As New OleDbConnection(cs)
        Using cmd As New OleDbCommand("select count(*) as num from mytable", cn)
            Try
                With cmd
                    .Connection.Open()
                End With
                dt.Load(cmd.ExecuteReader())
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Using
    End Using

End Sub

Private Sub btnSource2_Click(sender As Object, e As EventArgs) Handles btnSource2.Click

    Dim cs As String = "Provider=myprovider;Data Source=url2;Password=password2;User ID=userid2"
    Dim dt As New DataTable

    Using cn As New OleDbConnection(cs)
        Using cmd As New OleDbCommand("select count(*) as num from mytable", cn)
            Try
                With cmd
                    .Connection.Open()
                End With
                dt.Load(cmd.ExecuteReader())
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Using
    End Using

End Sub

【问题讨论】:

  • 通过使用Using 语句声明所有对象(DataTable 除外)来开始测试。您可以在此处删除OleDbDataAdapter,您实际上并没有使用它,只是Load() 带有DataReader 的DataTable。
  • "table" 是保留字。此外,正确处理所有具有Dispose 方法的对象。您可以考虑使用using statements
  • 我已经用 Using 语句修改了代码,但问题仍然存在。 “表格”只是一个示例 - 为了清楚起见,我已将其更新为 mytable。
  • 然后尝试OleDbConnection.ReleaseObjectPool()GC.Collect()。不过,它会超时。 - 您也可以尝试将Connection Lifetime(或Load Balance Timeout)设置为值> 0(表示秒数。0 = 最大超时)。
  • 我怀疑您对自定义提供程序中的问题是正确的。即使您的初始代码也可以与 sql server 提供程序或 ms 访问提供程序一起正常工作。我会将您的示例通过电子邮件发送给供应商。

标签: .net vb.net connection-string oledb


【解决方案1】:

如果我们可以看到这个更接近真实代码,也许我们可以看到错误。无论如何,如果您只是检索计数,请使用 ExecuteScalar

你可以将连接和命令组合在同一个Using中。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim cs As String = "Provider=myprovider;Data Source=url1;Password=password1;User ID=userid1"
    Dim Count As Integer
    Try
        Using cn As New OleDbConnection(cs),
                cmd As New OleDbCommand("select count(*) as num from mytable", cn)
            cn.Open()
            Count = CInt(cmd.ExecuteScalar())
        End Using
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
    Label1.Text = Count.ToString
End Sub

【讨论】:

    猜你喜欢
    • 2013-01-19
    • 1970-01-01
    • 2019-02-13
    • 2013-01-09
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多