【发布时间】: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