奇怪的ADO行为在VB6中生成不需要的NO_BROWSETABLE/set fmtonly查询



我正在处理ADO自动生成的一些不需要的元数据请求。该行为是在用SQLOLEDB替换默认MSDASQL提供程序后开始的。我也尝试过SQLOLEDB,其行为似乎是一样的。

事实证明,从IDE中重现这个问题很困难,因为它似乎是随机发生的。更令人信服的是,这些查询似乎请求以前打开(然后关闭)的记录集的元数据。

我在XP机器上使用VB6 SP6中的ADO 2.8,发现了一些与不需要的NO_BROWSETABLE/fmtonly/1=2查询有关的奇怪行为。

以下代码将重现该行为。

Private Sub Form_Load()
    Dim oConn As ADODB.Connection
    Set oConn = New ADODB.Connection
    'oConn.Open "DRIVER=SQL Server;SERVER=***;UID=***;password=***;APP=***"
    'oConn.Open "Provider=SQLOLEDB;SERVER=***;UID=***;password=***;APP=***"
    'oConn.Open "Provider=SQLNCLI10;Server=***;UID=***;PWD=***;APP=***"
    Dim rst As ADODB.Recordset
    Set rst = New ADODB.Recordset
    ' Execute the first query
    rst.Open "select 1", oConn
    rst.Close
    ' Execute the second query without specifying a connection
    rst.Open "select 2"
End Sub

我已经使用三个不同的提供程序测试了上面的代码。以下是SQL Server事件探查器的结果。

提供者1(MSDASQL)

select 1
go
select 2
go

提供程序2(SQLOLEDB)

select 1
go
-- This comes after executing the second query. Notice the query between FMTONLY ON/OFF is the FIRST query. 
SET NO_BROWSETABLE ON
go
SET FMTONLY ON select 1 SET FMTONLY OFF
go
SET NO_BROWSETABLE OFF
go
select 2
go

提供程序3(SQLNCLI10)

select 1
go
-- This comes after executing the second query. The behavior is the same as for SQLOLEDB, except that 'where 1=2' is appended to the query.
SET NO_BROWSETABLE ON
go
 set fmtonly on select 1 where 1=2 set fmtonly off
go
SET NO_BROWSETABLE OFF
go
select 2
go

结论:

如果您没有在第二个rst中指定连接。打开后,ADO将在继续之前向服务器请求有关PREVIOUS查询的元数据。

rst.Open "select 2", oConn

如上所述指定oConn将消除元数据请求,SQL Server Profiler将为所有三个提供程序生成相同的事件。

最新更新