![]() |
![]() |
![]() |
|
Помогите понять RecordSet.RecordCount() - всегда выдает -1 | ☑ | ||
---|---|---|---|---|
0
Drock
02.10.08
✎
16:53
|
query = "
|SELECT category_id |FROM jos_vm_category WHERE category_id='"+Выборка.Код+"'"; RSIDProduct.CursorType = 3; RSIDProduct.Open(query, Connection); Если RSIDProduct.RecordCount()= 0 Тогда Собственно вот кусок запроса к скл, по А. Михайлову, выставил курсортайп =3, однако рекордсет упорно дает количество полей -1 |
|||
1
smaharbA
02.10.08
✎
16:57
|
MoveFirst ?
|
|||
2
smaharbA
02.10.08
✎
16:58
|
хотя RSIDProduct.RecordCount это не поля... или я не въехал
|
|||
3
Drock
02.10.08
✎
16:59
|
Это количество записей в результате запроса
|
|||
4
Drock
02.10.08
✎
16:59
|
по идее
|
|||
5
Ns33
02.10.08
✎
17:00
|
-1 = Не может быть определено.
MSDN про CRecordset: "The total number of records is only known after the user has moved beyond the last record...To count the records yourself, call MoveNext repeatedly until IsEOF returns nonzero." Вкратце: до конца промотай. |
|||
6
Drock
02.10.08
✎
17:05
|
(5) можно ссылку
|
|||
7
Ns33
02.10.08
✎
17:08
|
||||
8
Drock
02.10.08
✎
17:08
|
Произошла исключительная ситуация (ADODB.Recordset): BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись.
|
|||
9
smaharbA
02.10.08
✎
17:09
|
|
|||
10
Ns33
02.10.08
✎
17:11
|
(8) ? Обычный перебор сделай.
Хотя тут они жульничают, вы пробегите до конца, а мы вам посчитаем записи. |
|||
11
Drock
02.10.08
✎
17:12
|
RSIDProduct.EOF()=Истина;
смотрю в отладке, после выполнения запроса Так же как и BOF |
|||
12
ДенисЧ
02.10.08
✎
17:12
|
(11) Значит, пусто
|
|||
13
Drock
02.10.08
✎
17:18
|
Что то не выходит каменный цветок :(
|
|||
14
Serg_1960
02.10.08
✎
17:30
|
Если RSIDProduct.EOF()=Истина И RSIDProduct.BOF()=Истина Тогда
Сообщение("Вот, блин, опять запрос неверно составил - ничего не находит"); КонецЕсли; |
|||
15
Drock
02.10.08
✎
21:30
|
(14) Как ни странно часть правды тут есть
Если (НЕ= RSIDProduct.EOF()) И (НЕ RSIDProduct.BOF()) Тогда Сообщение("В результате запроса таки есть данные"); КонецЕсли; |
|||
16
shachneff
02.10.08
✎
22:56
|
Сталкивался с такой проблемой около года назад, все уже забыл. Остался только код - привожу целиком.
Функция УстановитьПодключениеКБазеДанных() Экспорт Попытка Connection = Новый COMОбъект("ADODB.Connection"); Catalog = Новый COMОбъект("ADOX.Catalog"); Если ПолучитьСтрокуПодключения() Тогда Catalog.ActiveConnection = СокрЛП(СтрокаПодключения); Connection.Open(СокрЛП(СтрокаПодключения)); Иначе Connection = Неопределено; Catalog = Неопределено; ОтладочноеСообщение("Не удалось найти строку подключения к БД", СтатусСообщения.Важное); Возврат Ложь; КонецЕсли; Исключение Connection = Неопределено; Catalog = Неопределено; ОтладочноеСообщение(); Возврат Ложь; КонецПопытки; Возврат Истина; КонецФункции Функция ОтменитьПодключениеКБазеДанных() Экспорт Попытка Connection.Close(); Connection = Неопределено; Catalog = Неопределено; Исключение Connection = Неопределено; Catalog = Неопределено; ОтладочноеСообщение(); Возврат Ложь; КонецПопытки; Возврат Истина; КонецФункции //------------------------------------------------------------------------- Функция ВыполнитьЗапросSQL(ТекстЗапроса, RecordSet = "") // Новый Попытка ТЗ_Запроса = Новый ("ТаблицаЗначений"); Command = Новый COMОбъект("ADODB.Command"); Command.ActiveConnection = Connection; Command.CommandText = ТекстЗапроса; // текст надо фильтровать на недопустимые символы RecordSet = Новый COMОбъект("ADODB.RecordSet"); RecordSet = Command.Execute(); //Выполнение и получение набора данных // Проверка на пустой результат Если RecordSet.EOF() Тогда // и убрать за собой в памяти RecordSet = Неопределено; Command = Неопределено; ОтладочноеСообщение("Запрос не вернул ни одной строки", СтатусСообщения.Важное); Возврат 0; // ошибка КонецЕсли; // Инициализируем колонки Для НомерКолонки = 0 По RecordSet.Fields.Count-1 Цикл СтрЗагл = СтрЗаменить(RecordSet.Fields.Item(НомерКолонки).Name,"-","_"); Пока Не ТЗ_Запроса.Колонки.Найти(СтрЗагл) = Неопределено Цикл СтрЗагл = СтрЗагл + "_"; КонецЦикла; ТЗ_Запроса.Колонки.Добавить(СтрЗагл,,RecordSet.Fields.Item(НомерКолонки).Name, 15); КонецЦикла; // Перебор данных RecordSet.MoveFirst(); Пока RecordSet.EOF() = 0 Цикл СтрокаТаблицыЗначений = ТЗ_Запроса.Добавить(); Для НомерКолонки = 0 По RecordSet.Fields.Count-1 Цикл СтрокаТаблицыЗначений[НомерКолонки] = RecordSet.Fields(RecordSet.Fields.Item(НомерКолонки).Name).Value; Если ТипЗНЧ(СтрокаТаблицыЗначений[НомерКолонки]) = Тип("Число") Тогда СтрокаТаблицыЗначений[НомерКолонки] = СтрЗаменить(Формат(СтрокаТаблицыЗначений[НомерКолонки], "ЧРГ = '+'"),"+",""); КонецЕсли; КонецЦикла; RecordSet.MoveNext(); #Если Клиент Тогда Состояние("Обработано строк в запросе: " + ТЗ_Запроса.Количество()); #КонецЕсли КонецЦикла; RecordSet.Close(); // После того, как набор записей уже не нужен, его нужно закрыть // и убрать за собой в памяти RecordSet = Неопределено; Command = Неопределено; Возврат ТЗ_Запроса; // запрос успешно отработал Исключение // и убрать за собой в памяти RecordSet = Неопределено; Command = Неопределено; ОтладочноеСообщение(); Возврат 0; // ошибка КонецПопытки; КонецФункЦии |
|||
17
shachneff
02.10.08
✎
22:58
|
(16) Самое интересное - код не работает, если использовалась одна из двух разных строк подключения. Вот правильная (рабочая):
СтрокаПодключения = "Provider=MSDASQL.1;Password=123456;Persist Security Info=True;User ID=exch;Data Source=TradeX"; |
|||
18
Semeon555777
03.10.08
✎
01:20
|
Намудрили
Надо чтобы курсор был статический и тогда RecordCount будет возвращать количество записей Connection = Новый COMОбъект ("ADODB.Connection"); Connection.CursorLocation= 3; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |