2015-04-03 2 views
0

Я борюсь с некоторыми нежелательными запросами метаданных, автоматически генерируемыми ADO. Поведение началось после замены стандартного поставщика MSDASQL SQLOLEDB. Я также попробовал SQLOLEDB, и поведение похоже на то же самое.Странное поведение ADO, генерирующее нежелательные NO_BROWSETABLE/set fmtonly запросы в VB6

Воспроизведение проблемы из IDE оказалось трудным, потому что, похоже, это случайный случайный случай. Что еще более затрудняет то, что эти запросы, кажется, запрашивают метаданные для ранее открытых (а затем закрытых) наборов записей.

ответ

1

Я вызвал странное поведение, связанное с нежелательным запросом 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 даст то же событие для всех трех поставщиков.