Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > создание ошибки при выборе данных


Автор: Igor Graf 13.6.2005, 10:30
Привет всем большой!

У меня появился один, наверное простой вопрос, но че-то я никак не могу понять как это сделать, задача такая:

Значит есть у меня бд, с данными, я подключаю

Код

Data2.DatabaseName = "c:\Reyting.mdb"
Data2.RecordSource = "select * from Info where fieldsname = " & str5 & ""
Data2.Refresh


ну значит данные выбираются и выводятся на форму, теперь надо предусмотреть тот момент, когда данных нет, я делаю так:

Код

if data2.recordset.fields!fileldsname is nothing then
msgbox("ля ля")
end if

но че-то он этоусловие проскакивает, как быть, подскажите


с уважением Graf

Автор: Naghual 13.6.2005, 10:42
Что такое
Цитата
когда данных нет
?
Если реч идет об отсутствии записей в таблице, то нужно пользоватся свойствами RecordCount и EOF объекта Recordset.
Если говорить о незаполненных полях, то инструкция is nothing не сработает. Она служит для проверки содержания Объекта!
Проверяй через Is Null и/или Len(Trim$(data2.recordset.fields!fileldsname)) = 0

Автор: Igor Graf 13.6.2005, 11:56

Naghual спасибо, за помощь!

В данном случае речь идет именно об отсутствии записи в таблице info, из которой я выбираю записи.
Буду пробовать RecordCount
Еще раз спасибо

С уважением Graf

Автор: Гость_boevik 13.6.2005, 14:24
Проверяй рекордсет на EOF и BOF. Так как RecordCount не всегда дает верную информацию
Код

Data2.DatabaseName = "c:\Reyting.mdb"
Data2.RecordSource = "select * from Info where fieldsname = " & str5 & ""
Data2.Refresh
if data2.recordset.EOF = TRUE and data2.recordset.BOF = TRUE then
msgbox("ля ля")
end if

Автор: Naghual 13.6.2005, 17:35
Гость_boevik :
Это когда-же RecordCount дает не верную информацию?

Автор: boevik 14.6.2005, 08:18
К примеру самый простой случай когда все параметры берутся по умолчанию:
Код

Dim cn as New connection
Dim rs as recordset

cn.open ....
set rs = cn.execute "select ..."
Msgbox rs.recordcount
...


Во всех случаях, не зависимо есть данные или нет, recordcount равен -1.

Выдержка из http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdprorecordcount.asp:
Цитата
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.


Автор: Igor Graf 14.6.2005, 09:04
Большое спасибо boevik, весьма понятно и доступно

С уважением Graf

Автор: Naghual 14.6.2005, 10:37
boevik:
Вы батенька MSDN сильно далеко читаете! smile
А там сказано, что RecordCount нужно использовать после инструкций MoveLast и MoveFirst. Вот тогда он не будет вызывать описанные Вами выше проблемы.
Тоесть после каждого Открытия Recordset, добавления или удаления из него данных необходимо выполнять такой код:
Код

Recordset.MoveLast
Recordset.MoveFirst

И вот тогда RecordCount будет именно правильный.

Говоря по большому счету, RecordCount они придумали только для удобства и в самый последний момент. И как всегда недоработали! smile
А сами то пользуются EOF!

Автор: boevik 14.6.2005, 10:51
Naghual,
1) ты просил пример когда RecordCount не работает, пример приведен.
2) Где сказано, что надо выполнять Recordset.MoveLast: Recordset.MoveFirst?
3) В примере приведенном Igor Graf, не используется Recordset.MoveLast: Recordset.MoveFirst, да и проблематично его выполнять на пустом recordset-e.
4) Не всегда можно выполнить Recordset.MoveFirst. (В случае когда CursorType = adOpenForwardOnly)

Из все выше сказаного следует, что применять RecordCount довольно проблематично, но возможно.

Автор: Naghual 14.6.2005, 10:55
Согласен. Что тут скажеш.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)