Неонятное поведение ADODB.Connection (или Recordset)

Lockpickup
Дата: 25.12.2015 14:54:57
Аксесовская база mdb, Win7, 32
Происходит следующее: открываю рекордсет rezult_RS.Open, свойство RecordCount>0, записи есть.
Работаю, пишу новый код в другом модуле, запускаю этот же пример, и вдруг значение свойства RecordCount не определено, записей нет. Выполняю все то же в пошаговом режиме - работает. Пытаюсь еще раз в рантайме - записей нет.
Перезапускаю комп - работает. После нескольких выполнений - отпят записей нет!!
Хелп!

Создаю соединение
Function CreateADOConnectionToDB(ByRef CNN_obj As ADODB.Connection, cnn_string As String) As Boolean
    
    On Error GoTo ErrHandler

    CNN_obj.Open cnn_string, "юзверь", , adConnectUnspecified
    CreateADOConnectionToDB = True
    Exit Function
    
ErrHandler:
    'BasicFunctions.RaiseError 514
    If (Err.Number = 3705) Then
        MsgBox Err.Description
        CreateADOConnectionToDB = False
        Exit Function
    End If
    BasicFunctions.DisplayError
End Function

Функции передается переменная SMART_CNN
'*************************************** _
Пытаюсь добыть данные
Set rezult_RS = New ADODB.Recordset

SQL_query = "SELECT ID_SU, CF_Cumulative, Ïðèãîâîð, Revenue, Capex, Opex FROM [Èòîãè] " _
    & "WHERE ID_SU IN (SELECT ID_SU FROM " & SMEX_IDS_TABLE_NAME & " IN '" & SMART_Exec.TmpDBPath & "');"
Debug.Print SQL_query
rezult_RS.Open SQL_query, SMART_CNN, adOpenStatic, adLockReadOnly'ВОТ ОН ЭТОТ САМЫЙ ЗАТЫК
If Not (rezult_RS.RecordCount > 0) Then
    Set PrDisplayer = Nothing
    Exit Function
End If
'***************************************
debug.print
Дата: 25.12.2015 15:21:31
SMART_CNN.ConnectionString
Akina
Дата: 25.12.2015 15:28:59
ADODB.Recordset.RecordCount
Use the RecordCount property to find out how many records are in a Recordset object. The property returns -1 when ADO cannot determine the number of records or if the provider or cursor type does not support RecordCount. Reading the RecordCount property on a closed Recordset causes an error.

If the Recordset object supports approximate positioning or bookmarks—that is, Supports (adApproxPosition) or Supports (adBookmark), respectively, return True—this value will be the exact number of records in the Recordset, regardless of whether it has been fully populated. If the Recordset object does not support approximate positioning, this property may be a significant drain on resources because all records will have to be retrieved and counted to return an accurate RecordCount value.

Попробуй проверять
If (rezult_RS.BOF AND rezult_RS.EOF) Then
Lockpickup
Дата: 25.12.2015 15:47:50
Akina, пробовал я их проверять...

В пошаге:
CnnStr: Provider=Microsoft.ACE.OLEDB.12.0;User ID=уууу;Data Source=\\бла-бла\Access_version\FTTB_BC_2014.accdb;Mode=Share Deny None;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=пароль;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;Jet OLEDB:Bypass UserInfo Validation=False;Jet OLEDB:Limited DB Caching=False;Jet OLEDB:Bypass ChoiceField Validation=False;
BOF: False
EOF: False

В рантайме:

CnnStr: Provider=Microsoft.ACE.OLEDB.12.0;User ID=уууу;Data Source=\\бла-бла\Access_version\FTTB_BC_2014.accdb;Mode=Share Deny None;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=пароль;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;Jet OLEDB:Bypass UserInfo Validation=False;Jet OLEDB:Limited DB Caching=False;Jet OLEDB:Bypass ChoiceField Validation=False;
BOF: True
EOF: True

Кстати, на всякий случай, есть там в запросе внешняя БД:
SELECT ID_SU, CF_Cumulative, Ïðèãîâîð, Revenue, Capex, Opex FROM [Èòîãè] WHERE ID_SU IN (SELECT ID_SU FROM ID_table IN 'C:\Users\tmp\Documents\rad54A99tmp.mdb');
Akina
Дата: 25.12.2015 16:38:48
Lockpickup
В рантайме:
[skipped]
BOF: True
EOF: True

Получается, что рекордсет не фетчит записи на клиента, пока они реально не потребуются.
Так что придётся сотворять нечто типа
rezult_RS.Open ...
On Error Resume Next
rezult_RS.MoveFirst
On Error Goto ...
If (rezult_RS.BOF AND rezult_RS.EOF) Then
Lockpickup
Дата: 25.12.2015 16:47:10
Дык а что ж он после рестарта компа первые N (где N - величина не постоянная) раз фетчит, а потом как-то разучивается это делать... Вот я чего понять не могу и, соответсвенно, как лечить не понятно...
Попробовал после открытия рекордсета сделать Sleep 10 000 - не помогло.
И нельзя сделать set rezult_RS=SMART_CNN.Excecute (SQL_query) т.к. я потом использую rezult_RS.Find
Akina
Дата: 25.12.2015 16:58:40
Тебе нужен код, который ВСЕГДА даёт один и тот же результат, верно? значит, ориентируйся на наихудшее.
Lockpickup
Дата: 28.12.2015 15:02:48
Навряд ли это мой случай.
У меня рекордсет вообще не имеет записей (в рантайм). А в пошаге все ОК.
Lockpickup
Дата: 28.12.2015 15:11:48
Ахтунг!!!
Помог Sleep 1000 после
Set rezult_RS = New ADODB.Recordset

А вот 100 миллисекунд не достаточно.
Понятно, что это нифига не решение...