powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ado.RecordCount -1
27 сообщений из 27, показаны все 2 страниц
Ado.RecordCount -1
    #33558626
solo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, как лечится RecordCount -1

На форуме много ответов, но не нашел работающего


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Dim p1 As New ADODB.Parameter

Set con = New ADODB.Connection
Set rs = New ADODB.Recordset
Set cmd = New ADODB.Command

Set p1 = cmd.CreateParameter("object_name", adVarChar, adParamInput,  255 , "Moscow")

con.Open "Provider=MSDASQL.1;UID=userid1;PWD=password1;DRIVER={Microsoft ODBC for Oracle};SERVER=baza;"
rs.ActiveConnection = con
cmd.ActiveConnection = con
cmd.CommandText = "SELECT *  FROM table WHERE on = :object_name"
cmd.CommandType = adCmdText
cmd.Parameters.Append p1

rs.CursorLocation = adUseClient
rs.CursorType = adOpenStatic
Set rs = cmd.Execute
MsgBox rs.RecordCount
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558667
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так?

автор
rs.MoveLast
MsgBox rs.RecordCount
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558684
solo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Набор строк не поддерживает обратную передачу
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558728
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у тебя к rs не привязан запросом или таблица
rs коннект есть надо еще вставть запрос
rs.Open "Select * from table",rs.activeconnection,adOpenStatic
комманд в данном контексте не связан с рекордсетом
лучше сделай так
"Select * from table where on = '" & Text.Text & "'",rs.activeconnection,adOpenStatic
если тебе нужна выборака в sql по переменной VB то можно обойтись без параметра а просто скомбинировать запрос с перемнной Vb
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558759
solo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть вот такая вещь
Код: plaintext
Set rs = cmd.Execute

это 2-я строчка снизу

использую объект Command, что бы можно было использовать переменные привязки.
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558762
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извеняюсь на счет
у тебя к rs не привязан запросом или таблица
не заметил в коде это
Set rs = cmd.Execute
MsgBox rs.RecordCount

а по поводу параметра попробуй обойтись без него
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558785
solo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
параметр, это принципиальная вещь, не откажусь
иначе кеш разбора SQL команд забивается, и проседает перформанс.
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558840
solo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
какая то засада
даже после того, как пробежал все строки, выдает
RecordCount = -1


Код: plaintext
1.
2.
3.
4.
5.
MsgBox rs.RecordCount
While Not rs.EOF
 MsgBox rs.Fields( 0 ) 
rs.MoveNext
Wend
MsgBox rs.RecordCount

даже после смены провайдера но оракловский
Код: plaintext
con.Open "Provider=OraOLEDB.Oracle.1;User ID=userid1;Password=userid1;Data Source=baza;"
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558855
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
solo28Набор строк не поддерживает обратную передачу

MSDN
The cursor type of the Recordset object affects whether the number of records can be determined. The RecordCount property will return -1 for a forward-only cursor ; the actual count for a static or keyset cursor; and either -1 or the actual count for a dynamic cursor, depending on the data source.
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558862
solo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это разве не то ?
Код: plaintext
rs.CursorType = adOpenStatic
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558872
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не то. Вам уже ответили.
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558897
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так?

автор
Provider=MSDAORA
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558906
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку...

Строка подключения:

авторTypical Connection String

A typical connection string for this provider is:

"Provider=MSDAORA;Data Source=serverName;User ID=userName; Password=userPassword;"
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558947
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы ваши рекордсеты смогли открываться как Static и, следовательно был RowCount <> -1, надо коннекшн открывать на стороне клиента.
con.CursorLocation = adUseClient
con.Open ......

по умолчанию коннекшн - на стороне сервера.
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33558975
solo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Melkiades

если попытаться перевести MSDN по данной проблеме, то

Тип курсора объекта Recordset затрагивает, может ли быть определено число строк. Значение RecordCount возвращает -1 для forward-only курсора; фактическое значение для static или keyset cursor; и -1 или фактическое значение для dynamic cursor.



Если я использую
Код: plaintext
1.
rs.CursorLocation = adUseClient
rs.CursorType = adOpenStatic

то должно возвращаться верное значение
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33559030
solo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
поменял провайдера на
Provider=MSDAORA

результат прежний

неужели ни кто не сталкивался с такой проблемой при работеADO c базами Oracle ?
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33559053
solo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Worobjoff
спасибо, получилось
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33559165
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffЧтобы ваши рекордсеты смогли открываться как Static и, следовательно был RowCount <> -1, надо коннекшн открывать на стороне клиента.
con.CursorLocation = adUseClient
con.Open ......

по умолчанию коннекшн - на стороне сервера.

Можно переопределить это для каждого рекордсета...

Ничего не мешает сделать вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset

Set con = New Connection

con.ConnectionString = "СТРОКА ПОДКЛЮЧЕНИЯ"
con.CursorLocation = adUseServer

con.Open

Set rs = New ADODB.Recordset

rs.CursorLocation = adUseClient

rs.Open "Select * from Users", con, adOpenStatic, adLockOptimistic

MsgBox rs.RecordCount
MsgBox con.CursorLocation


Я проморгал, что рекордсет в данном примере открывается через Execute :-(...
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33559185
solo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
почему то разработчики стандарта ADO забыли добавить возможность привязывать переменные к RecordSet, поэтому весь этот изврат с Command.Execute
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33559191
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Резюме:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
' здесь Вы объявили rs
Dim rs As ADODB.Recordset

' здесь создали объект
Set rs = New ADODB.Recordset

' здесь определили его свойства
rs.CursorLocation = adUseClient
rs.CursorType = adOpenStatic

' а тут создали НОВЫЙ объект, свойства он получил от команд и, как следствие,   коннекшена...
Set rs = cmd.Execute


Все .
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33559200
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
solo28почему то разработчики стандарта ADO забыли добавить возможность привязывать переменные к RecordSet, поэтому весь этот изврат с Command.Execute

Тогда так:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Set cmd = New ADODB.Command

cmd.CommandText = "Select * from Users"
cmd.ActiveConnection = con

Set rs = New ADODB.Recordset

rs.CursorLocation = adUseClient

rs.Open cmd, , adOpenStatic, adLockOptimistic

MsgBox rs.RecordCount
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33559825
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
solo28почему то разработчики стандарта ADO забыли добавить возможность привязывать переменные к RecordSet, поэтому весь этот изврат с Command.ExecuteПравильно сказать по-другому: Разработчики ADO ограничили доступ к объектам Command рекордсета. Мы не можем обращаться к этим четырем Command-ам рекордсета посредством которых он обращается к БД. В dotnet это стало возможно.
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33559851
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как правильно сгенерировать значения ADO RecordCount в VB...
авторSet recordset = command.Execute( RecordsAffected , Parameters, Options )

RecordsAffected - тоже даёт -1?
Также, для MSSQL можно заюзать @@RECORDCOUNT... Или это был риторический вопрос?
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33559919
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser Как правильно сгенерировать значения ADO RecordCount в VB...
авторSet recordset = command.Execute( RecordsAffected , Parameters, Options )

RecordsAffected - тоже даёт -1?
Также, для MSSQL можно заюзать @@RECORDCOUNT... Или это был риторический вопрос?
Поправка:
Код: plaintext
@@ROWCOUNT
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33559980
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитал я совет по указанной ссылке и должен привести два замечания к статье:
1. Однако вам будет также интересно узнать, что значение RecordCount равно -1 для наборов записей, созданных с помощью метода Execute для объекта Connection или Command. Это происходит потому, что данный метод генерирует набор записей, перемещаться по которому можно только вперед ...- В данном случае, рекордсет Можно настроить чтобы он не был ForwardOnly.
2. Не все провайдеры поддерживают рекордсеты Keyset. Но все (или по крайней мере все с которыми пришлось мне столкнуться) поддерживают Static-рекордсеты.
Поэтому коннекшн на стороне клиента плюс статик рекордсет Всегда даст вам RecordCount <> -1. Даже если открыть его как Set rs = Command1.Execute.
Единственное замечание к последней конструкции: тип блокировки и тип курсора рекордсета надо указать. И до его открытия.
Конечно, надо давать себе отчет в том что тогда мы будем работать с Оптимистической блокировкой.
...
Рейтинг: 0 / 0
Ado.RecordCount -1
    #33560500
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу пардона... очепятался... К сожалению не удалось мне найти мою любимую статью на эту тему... кинул, что первое попалось... Больше так не буду :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Ado.RecordCount -1
    #39510241
alex_bold_78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
solo28,

Укажи тип курсора RecordSet rs.CursorType = adOpenStatic
До команды
rs.Open
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ado.RecordCount -1
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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