奇怪的ADO行为在VB6中生成不需要的NO_BROWSETABLE /设置fmtonly查询
问题描述:
我正在琢磨一些由ADO自动生成的不需要的元数据请求。该行为在用SQLOLEDB替换默认MSDASQL提供程序后开始。我也尝试过SQLOLEDB,行为似乎是一样的。奇怪的ADO行为在VB6中生成不需要的NO_BROWSETABLE /设置fmtonly查询
从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 Profiler结果。
提供者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
结论:
如果你不指定一个连接然后打开,ADO将在继续之前向服务器请求关于PREVIOUS查询的元数据。
rst.Open "select 2", oConn
如上所述指定oConn将消除元数据请求,并且SQL Server Profiler将为所有三个提供程序产生相同的事件。