Я вызвал странное поведение, связанное с нежелательным запросом NO_BROWSETABLE/fmtonly/1 = 2 с использованием ADO 2.8 в VB6 SP6 на компьютере XP.
Следующий код воспроизведет поведение.
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.
Provider 1 (MSDASQL)
select 1
go
select 2
go
Provider 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
Provider 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
Вывод:
Если вы не» t указать соединение n во втором р. Open.Open, тогда ADO будет запрашивать сервер для метаданных в отношении ПРЕДВАРИТЕЛЬНОГО запроса перед продолжением.
rst.Open "select 2", oConn
Указание oConn как указано выше, устранит запрос метаданных и SQL Server Profiler даст то же событие для всех трех поставщиков.