Error 3021

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Dan2005
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 27.10.2005 (Чт) 14:20

Error 3021

Сообщение Dan2005 » 17.11.2005 (Чт) 19:34

Работаю над готовым проектом на vb6. Возникла след проблема, чтение из базы данных в этом проекте везде происходит примерно вот так:
Dim SCount As New ADODB.Recordset
SQL$ = "SELECT Log.Seq, Log.ID FROM Log WHERE Log.ID = " & Val(frmBoard.SSDBGrid1.Columns(13).Value) & " AND Log.SDate < #" & Format(Date, "mm/dd/yyyy") & "#;"
If SCount.State = 1 Then
SCount.Close
End If
SCount.open ConvertQuery(SQL$), MyDB, adOpenStatic, adLockReadOnly
SCount.MoveLast
SCount.MoveFirst
и далее идет работа с переменной SCount...
Вопрос: зачем перемещаться по записям MoveLast-MoveFirst? Приведенный код встречается в проекте дважды (один в один), так вот в одном месте при этих перемещениях по записям выдает ошибку 3021. Не знаю как с ней бороться! Плиз, хелп!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.11.2005 (Чт) 19:42

1. Внедрение переменных в текст запроса прекратить, использовать ADODB.Command.
2. Что понятнее: 1 или adStateOpen?
3. ConvertSQL (подозреваю, что он делает) убрать, использовать ADODB.Command.

По существу вопроса.
Переход на последнюю запись делается нехорошими программистами для определения количества записей в рекордсете, потому что после этого recordcount что-то начинает значить.
На самом деле можно просто открыть клиентский рекордсет.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Dan2005
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 27.10.2005 (Чт) 14:20

Сообщение Dan2005 » 17.11.2005 (Чт) 19:58

а какими способами можно определить количество записей в рекордсете? что значит открыть клиентский?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.11.2005 (Пт) 9:00

Клиентский рекордсет -- это рекордсет с CursorLocation=adClient. После этого можно использовать свойство RecordCount.
Lasciate ogni speranza, voi ch'entrate.

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 18.11.2005 (Пт) 9:35

А в какой ситуации выдает RecordCount=-1 и какие "неприятности" могут возникать при использовании CursorLocation=adClient?
Вопрс может звучать КорЯво, но (честно говоря), у меня была похожая проблемка . Решение было принято "навсегда":
If rst.RecordCount <>0 Then
rst.MoveLast
rc=rst.RecordCount
rst.MoveFirst
...
Всегда работает!. Однако.. может приспичить :?:
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.11.2005 (Пт) 10:07

RecordCount=-1 бывает при серверном курсоре.

При клиентском курсоре все данные (рекордсет) хранятся у клиента, т.е. сервер передает полученную выборку по сетке. В случае большого рекордсета и/или слабой сетки будут тормоза. Но зато это дает возможность делать сортировку/фильтр на клиенте, не нагружая сервер. Или использовать отвязанный рекордсет.
При серверном курсоре такой проблемы нет, но и нет части функциональности.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Error 3021

Сообщение Andrey Fedorov » 18.11.2005 (Пт) 13:30

Dan2005 писал(а):SQL$ = "SELECT Log.Seq, Log.ID FROM Log WHERE Log.ID = " & Val(frmBoard.SSDBGrid1.Columns(13).Value) & " AND Log.SDate < #" & Format(Date, "mm/dd/yyyy") & "#;"


Просто неправильно составляешь строку запроса.

Для MS SQL условие на дату должно прописывться так:

Код: Выделить всё
" SELECT ... FROM ... WHERE ... AND Log.SDate < '" & Format(Date, "yyyymmdd") & "'"
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Error 3021

Сообщение Andrey Fedorov » 18.11.2005 (Пт) 13:47

Dan2005 писал(а):SQL$ = "SELECT Log.Seq, Log.ID FROM Log WHERE Log.ID = " & Val(frmBoard.SSDBGrid1.Columns(13).Value) & " AND Log.SDate < #" & Format(Date, "mm/dd/yyyy") & "#;"


Просто неправильно составляешь строку запроса.

Для MS SQL условие на дату должно прописывться так:

Код: Выделить всё
" SELECT ... FROM ... WHERE ... AND Log.SDate < '" & Format(Date, "yyyymmdd") & "'"
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 20.11.2005 (Вс) 12:37

alibek писал(а):RecordCount=-1 бывает при серверном курсоре.

При клиентском курсоре все данные (рекордсет) хранятся у клиента...

Не хочу Вас терзать (возможно простыми) вопросами, но я не очень понял разницу и главное зачем это придумано. Наверное для разгрузки "сетки"? Нет ли ссылочки (лучьше на русском), а то я не нашел.
Хотя , подозреваю, что в ответе Alibek'а содержится лаконичное и почти полное пояснение :oops: (он всегда дает такие ответы)
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.11.2005 (Пн) 9:08

Ну, к примеру, результатом выборки может быть рекордсет на пару десятков (сотен) мегабайт. И перемещать его по сетке на клиента (особенно если сеть не локальная) будет очень долго и неудобно. Поэтому используется серверный курсор.
У клиентского курсора свои преимущества, прежде всего возможность сортировки и использования отвязанных рекордсетов.
Какое именно размещение курсора использовать, решает сам разработчик.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: SemrushBot и гости: 39

    TopList