ADODB.Recordset (recordcount =-1) ???

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Alex404
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.09.2002 (Вс) 10:58

ADODB.Recordset (recordcount =-1) ???

Сообщение Alex404 » 27.05.2003 (Вт) 23:59

Такая вот штуковина...
Dim Base As New ADODB.Connection
Dim RS1 As ADODB.Recordset, RS2 as ADODB.Recordset

Base.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=base.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False"

SQL1="SELECT ..."
SQL2="SELECT ..."

Set rs1 = Base.Execute(SQL1)
Set rs2 = Base.Execute(SQL2)

Один из RS - ОБЯЗАТЕЛЬНО будет пустой, другой ОБЯЗАТЕЛЬНО будет содержать одну запись.

Задача определить непустой.

Первое что приходит в голову это сравнить RS1.recordcount и RS2.recordcount. Удивительно, но оба эти значения получаются = -1 (?).
Причем если зайти с другого конца и сравнить RS1.EOF и RS2.EOF то пустой сразу кричит TRUE (как и положено), а непустой FALSE соответственно.
Т.е. задача с принципе решается, а все равно интересно, что там с recordcount происходит?

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 28.05.2003 (Ср) 7:46

нужно проверить два свойства рекордсета

Код: Выделить всё
If Recordset.BOF = True And Recordset.EOF = True Then
    ' рекордсет пустой
End If


BOF - начало рекордсета
EOF - ну ты знаешь :wink:

Alex404 писал(а):..., что там с recordcount происходит?


а Recordcount обновится если ты дойдеш до конца набора записей
Recordset.MoveLast, после чего нужно вернутся в начало. Но это не всегда так, если мне не изменяет склероз, то в статическом рекордсете, Recordcount сразу возвращает количество записей, а в остальных только после того, как ты пролистаешь все записи.
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Alex404
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.09.2002 (Вс) 10:58

Сообщение Alex404 » 28.05.2003 (Ср) 7:57

Спасибо! Все так и есть!
За BOF спасибо отдельное - как то выпало, понимаешь, из внимания...

Шмульке
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 21.08.2003 (Чт) 8:17
Откуда: Владивосток

VB -> MS SQL 2000 через ADO

Сообщение Шмульке » 12.01.2004 (Пн) 11:07

Что называется - похвалю себя, что дочитал аж до предпоследней страницы форума...не хотелось новый топик заводить из-за пустякового вопроса... :wink:

Вопрос к товорищу Cyrax:

нельзя ли поподробней об RecordSet ?

если для Alex404 было не принципиально значение RecordCount, то для меня имеет (!)

суть вопроса: как заставить RecordSet "говорить правду" :o вместо стандартного значения -1 ??? :?:



Alex404 писал(а):..., что там с recordcount происходит?


Cyrax писал(а):а Recordcount обновится если ты дойдеш до конца набора записей
Recordset.MoveLast, после чего нужно вернутся в начало. Но это не всегда так, если мне не изменяет склероз, то в статическом рекордсете, Recordcount сразу возвращает количество записей, а в остальных только после того, как ты пролистаешь все записи.


------
убейте меня, но не нашел я свойства отвечающего за "статику"....

код бы поглядеть

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 13.01.2004 (Вт) 20:52

черт, не хотел же в сеть лезть... так ведь заставили...
ладно ща попробую чё-нибудь сообразить

давненько я уже не использовал свойство RecordCount... и ни одной книги, как назло, под рукой нет... значит так объект Recordset может возвращать несколько типов наборов записей. каждый из них имеет свои преимущества и недостатки. лично я чаще всего использую два из них (блин бежать через весь кабинет к бейсику... ну ладно сбегаю :)) - adOpenKeyset и adOpenDynamic. (ладно хоть RemoteControl настроил...)
первый из них я использую когда мне нужно только прочитать данные, а второй - когда мне требуется данные не только читать, но и изменять.
еще есть adOpenForwardOnly и adOpenStatic.
это константы из библиотеки ADO. и указывают они тип курсора для открываемого набора.
Код: Выделить всё
RS.Open [Source], [ActiveConnection], [CursorType = adOpenDynamic|adOpenKeyset|adOpenForwardOnly|adOpenStatic],...


ой блин... надеюсь, поймешь...

что касается RecordCount - я точно не помню, как именно на значение этого свойства влияет CursorType. но то, что влияет - это точно :)

за подробностями лучше загляни в MSDN...
еще рекомендую почитать книги "Руководство разработчика баз данных на Visual Basic 6" (Роджер Дженнингс) и "Обработка баз данных на Visual Basic 6" (Джеффри П. Мак-Манус)
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList