2015-04-03 45 views
0

我正在琢磨一些由ADO自动生成的不需要的元数据请求。该行为在用SQLOLEDB替换默认MSDASQL提供程序后开始。我也尝试过SQLOLEDB,行为似乎是一样的。奇怪的ADO行为在VB6中生成不需要的NO_BROWSETABLE /设置fmtonly查询

从IDE中重现问题已被证明是困难的,因为它似乎是随机发生的。更令人置疑的是,这些查询似乎要求先前打开(然后关闭)记录集的元数据。

回答

1

我在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将为所有三个提供程序产生相同的事件。