Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Неонятное поведение ADODB.Connection (или Recordset) / 13 сообщений из 13, страница 1 из 1
25.12.2015, 14:54
    #39138219
Lockpickup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неонятное поведение ADODB.Connection (или Recordset)
Аксесовская база mdb, Win7, 32
Происходит следующее: открываю рекордсет rezult_RS.Open, свойство RecordCount>0, записи есть.
Работаю, пишу новый код в другом модуле , запускаю этот же пример, и вдруг значение свойства RecordCount не определено, записей нет. Выполняю все то же в пошаговом режиме - работает. Пытаюсь еще раз в рантайме - записей нет.
Перезапускаю комп - работает. После нескольких выполнений - отпят записей нет!!
Хелп!

Создаю соединение
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
'*************************************** _
Пытаюсь добыть данные
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
'***************************************
...
Рейтинг: 0 / 0
25.12.2015, 15:21
    #39138251
debug.print
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неонятное поведение ADODB.Connection (или Recordset)
SMART_CNN.ConnectionString
...
Рейтинг: 0 / 0
25.12.2015, 15:28
    #39138258
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неонятное поведение ADODB.Connection (или Recordset)
ADODB.Recordset.RecordCountUse 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.

Попробуй проверять
Код: vbnet
1.
If (rezult_RS.BOF AND rezult_RS.EOF) Then
...
Рейтинг: 0 / 0
25.12.2015, 15:47
    #39138278
Lockpickup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неонятное поведение ADODB.Connection (или Recordset)
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

Кстати, на всякий случай, есть там в запросе внешняя БД:
Код: plsql
1.
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');
...
Рейтинг: 0 / 0
25.12.2015, 16:38
    #39138317
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неонятное поведение ADODB.Connection (или Recordset)
LockpickupВ рантайме:
[skipped]
BOF: True
EOF: True
Получается, что рекордсет не фетчит записи на клиента, пока они реально не потребуются.
Так что придётся сотворять нечто типа
Код: vbnet
1.
2.
3.
4.
5.
rezult_RS.Open ...
On Error Resume Next
rezult_RS.MoveFirst
On Error Goto ...
If (rezult_RS.BOF AND rezult_RS.EOF) Then
...
Рейтинг: 0 / 0
25.12.2015, 16:47
    #39138325
Lockpickup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неонятное поведение ADODB.Connection (или Recordset)
Дык а что ж он после рестарта компа первые N (где N - величина не постоянная) раз фетчит, а потом как-то разучивается это делать... Вот я чего понять не могу и, соответсвенно, как лечить не понятно...
Попробовал после открытия рекордсета сделать Sleep 10 000 - не помогло.
И нельзя сделать set rezult_RS=SMART_CNN.Excecute (SQL_query) т.к. я потом использую rezult_RS.Find
...
Рейтинг: 0 / 0
25.12.2015, 16:58
    #39138332
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неонятное поведение ADODB.Connection (или Recordset)
Тебе нужен код, который ВСЕГДА даёт один и тот же результат, верно? значит, ориентируйся на наихудшее.
...
Рейтинг: 0 / 0
25.12.2015, 22:28
    #39138492
`
`
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неонятное поведение ADODB.Connection (или Recordset)
...
Рейтинг: 0 / 0
28.12.2015, 15:02
    #39139370
Lockpickup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неонятное поведение ADODB.Connection (или Recordset)
Навряд ли это мой случай.
У меня рекордсет вообще не имеет записей (в рантайм). А в пошаге все ОК.
...
Рейтинг: 0 / 0
28.12.2015, 15:11
    #39139384
Lockpickup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неонятное поведение ADODB.Connection (или Recordset)
Ахтунг!!!
Помог Sleep 1000 после
Код: vbnet
1.
Set rezult_RS = New ADODB.Recordset


А вот 100 миллисекунд не достаточно.
Понятно, что это нифига не решение...
...
Рейтинг: 0 / 0
28.12.2015, 15:54
    #39139432
Rivkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неонятное поведение ADODB.Connection (или Recordset)
При открытии рекордсета всегда объявляй явно .CursorLocation = adUseClient
...
Рейтинг: 0 / 0
28.12.2015, 16:03
    #39139447
Lockpickup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неонятное поведение ADODB.Connection (или Recordset)
Rivkin Dmitry, добавил перед открытием строку rezult_RS.CursorLocation = adUseClient.
Не спасло...
...
Рейтинг: 0 / 0
28.12.2015, 16:07
    #39139452
Lockpickup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неонятное поведение ADODB.Connection (или Recordset)
Пока что удалось определить следующее:
если из SQL запроса исключить часть с внешней таблицей все работает нормально.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Неонятное поведение ADODB.Connection (или Recordset) / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]