Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ado.RecordCount -1 / 25 сообщений из 27, страница 1 из 2
21.02.2006, 15:23
    #33558626
solo28
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
Коллеги, как лечится 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
21.02.2006, 15:34
    #33558667
Дурак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
А так?

автор
rs.MoveLast
MsgBox rs.RecordCount
...
Рейтинг: 0 / 0
21.02.2006, 15:38
    #33558684
solo28
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
Набор строк не поддерживает обратную передачу
...
Рейтинг: 0 / 0
21.02.2006, 15:51
    #33558728
TIKO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
у тебя к 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
21.02.2006, 15:57
    #33558759
solo28
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
есть вот такая вещь
Код: plaintext
Set rs = cmd.Execute

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

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

а по поводу параметра попробуй обойтись без него
...
Рейтинг: 0 / 0
21.02.2006, 16:04
    #33558785
solo28
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
параметр, это принципиальная вещь, не откажусь
иначе кеш разбора SQL команд забивается, и проседает перформанс.
...
Рейтинг: 0 / 0
21.02.2006, 16:22
    #33558840
solo28
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
какая то засада
даже после того, как пробежал все строки, выдает
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
21.02.2006, 16:28
    #33558855
Дурак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
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
21.02.2006, 16:29
    #33558862
solo28
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
это разве не то ?
Код: plaintext
rs.CursorType = adOpenStatic
...
Рейтинг: 0 / 0
21.02.2006, 16:31
    #33558872
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
Не то. Вам уже ответили.
...
Рейтинг: 0 / 0
21.02.2006, 16:40
    #33558897
Дурак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
А так?

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

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

авторTypical Connection String

A typical connection string for this provider is:

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

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

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

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



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

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

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

неужели ни кто не сталкивался с такой проблемой при работеADO c базами Oracle ?
...
Рейтинг: 0 / 0
21.02.2006, 17:21
    #33559053
solo28
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
to Worobjoff
спасибо, получилось
...
Рейтинг: 0 / 0
21.02.2006, 17:57
    #33559165
Дурак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
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
21.02.2006, 18:04
    #33559185
solo28
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
почему то разработчики стандарта ADO забыли добавить возможность привязывать переменные к RecordSet, поэтому весь этот изврат с Command.Execute
...
Рейтинг: 0 / 0
21.02.2006, 18:06
    #33559191
Дурак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
Резюме:

Код: 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
21.02.2006, 18:12
    #33559200
Дурак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
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
22.02.2006, 08:50
    #33559825
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
solo28почему то разработчики стандарта ADO забыли добавить возможность привязывать переменные к RecordSet, поэтому весь этот изврат с Command.ExecuteПравильно сказать по-другому: Разработчики ADO ограничили доступ к объектам Command рекордсета. Мы не можем обращаться к этим четырем Command-ам рекордсета посредством которых он обращается к БД. В dotnet это стало возможно.
...
Рейтинг: 0 / 0
22.02.2006, 09:13
    #33559851
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
Как правильно сгенерировать значения ADO RecordCount в VB...
авторSet recordset = command.Execute( RecordsAffected , Parameters, Options )

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

RecordsAffected - тоже даёт -1?
Также, для MSSQL можно заюзать @@RECORDCOUNT... Или это был риторический вопрос?
Поправка:
Код: plaintext
@@ROWCOUNT
...
Рейтинг: 0 / 0
22.02.2006, 10:13
    #33559980
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ado.RecordCount -1
Прочитал я совет по указанной ссылке и должен привести два замечания к статье:
1. Однако вам будет также интересно узнать, что значение RecordCount равно -1 для наборов записей, созданных с помощью метода Execute для объекта Connection или Command. Это происходит потому, что данный метод генерирует набор записей, перемещаться по которому можно только вперед ...- В данном случае, рекордсет Можно настроить чтобы он не был ForwardOnly.
2. Не все провайдеры поддерживают рекордсеты Keyset. Но все (или по крайней мере все с которыми пришлось мне столкнуться) поддерживают Static-рекордсеты.
Поэтому коннекшн на стороне клиента плюс статик рекордсет Всегда даст вам RecordCount <> -1. Даже если открыть его как Set rs = Command1.Execute.
Единственное замечание к последней конструкции: тип блокировки и тип курсора рекордсета надо указать. И до его открытия.
Конечно, надо давать себе отчет в том что тогда мы будем работать с Оптимистической блокировкой.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ado.RecordCount -1 / 25 сообщений из 27, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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