powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Не могу получить кол-во строк rs.RecordCount
21 сообщений из 21, страница 1 из 1
Не могу получить кол-во строк rs.RecordCount
    #37811393
Minch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rs.RecordCount постоянно выдает "-1"
авторDim cn As New ADODB.Connection
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
With rs
.CursorType = adOpenStatic
.LockType = adLockOptimistic
.CursorLocation = adUseClient
End With

cn.ConnectionString = "Provider=SQLOLEDB.1;Password=KLjmj988;Persist Security Info=True;User ID=sa;Data Source=ANALITIKI"
cn.Open

For i = 1 To 40
code_imt = Cells(i, 1)
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "FunctionBase.dbo.Code_IMTto1C"
cmd.Parameters.Append cmd.CreateParameter("@code_imt", adInteger, adParamInput, , code_imt)
Set rs = cmd.Execute()

a = rs.RecordCount

Cells(i, 2).CopyFromRecordset rs
Next
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37811400
Minch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробовал добавлять перед a = rs.RecordCount, выражение rs.movelast
Выдает ошибку "набор строк не поддерживает обратную выборку."
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37811449
Minch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще обнаружил что .CursorType = adOpenStatic,
после выполнения команды Set rs = cmd.Execute()
меняется на CursorType = adOpenForwardOnly

поэтому и не работает rs.movelast, в следствие чего не могу определить rs.RecordCount

Вопрос: как избежать перемены CursorType
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37811511
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Command.Execute возвращает объект Recordset, поэтому строки
Код: vbnet
1.
2.
3.
4.
5.
6.
Set rs = New ADODB.Recordset
 With rs
 .CursorType = adOpenStatic
 .LockType = adLockOptimistic
 .CursorLocation = adUseClient
 End With

не нужны в принципе и ни на что не влияют

это просто комментарий, как оказалось, я не знаю ответ на этот вопрос, всегда пользовался только ForwardOnly, сходу нужных опций не нашел
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37811562
Oleg_Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Minch, при объявлении CommandType = adCmdStoredProc возвращаемое значение можно извлечь только из выходящего параметра хранимой процедуры если такое имеется а набор записей не возвращается, поэтому и ошибка о закрытом рекордсете.
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37811579
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_Slip, у ТС другая проблема, рекордсет открытые, но не поддерживает Backward
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37811611
Oleg_Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, проблема в том что rs.RecordCount выдает -1 и это потому что рекордсет пуст и не может быть заполнен в силу описанных мною выше причин.
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37811630
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_Slip, ниче подобного. rs.RecordCount выдает -1 потому что ForwardOnly, при этом Set rs = cmd.Execute() преспокойно возвращает нормальный заполненный рекордсет, у которого невозможно определить количество записей по вышеуказанной причине.
Вопрос только в том, как заставить cmd.Execute вернуть Static или KeySet
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37811664
Minch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Ты полностью прав.
Set rs = cmd.Execute() возвращает заполненный рекордсет.
Его можно посмотреть выведя rs.getstring
В выводимых данных больше одной строки.
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37811721
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полный синтаксис данной конструкции выглядит так:

Set recordset = command.Execute( RecordsAffected, Parameters, Options )

подробно об этом - на MSDN
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37811726
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElenHim,

Верно, но какой именно параметр за это отвечает? Я не нашел
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37812029
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мдась, немного перепутал(

Set recordset = command.Execute( RecordsAffected , Parameters, Options )
RecordsAffected покажет кол-во для Insert/Update/Delete, но не для Select.

Тем не менее, получить кол-во строк для Select можно без recordcount. Для этого в самой sp нужно добавить что-то типа
"SELECT COUNT(*) RCount FROM Table", например до оновного запроса.

На VBA будет так

Код: vbnet
1.
2.
3.
4.
Dim RCount as long
Set rs = cmd.Exусute,
RCount = rs.Fields("RCount") 'количество строк
Set rs = rs.NextRecordset ' - собственно рекордсет
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37812058
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElenHim,

Особенно офигенно получается, если запрос выполняется, скажем, минуту.
Еще минуту потратить только на то, чтобы посчитать количество записей.
Не, ну можно, конечно, для ускорения сделать временную таблицу и т.п.
Если автор скажет, какие цели у него и какие вариации допустимы, то можно посоветовать обходные пути.

Но меня как раз интересует вопрос в первоначальной постановке автора:
Для Recordset.Open можно задать тип курсора.
Можно ли (и как) задать его для Command.Execute или для Connection.Execute?
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37812174
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

нескромный вопрос, вы много способов умеете посчитать кол-во строк результирующего запроса на стороне сервера, кроме COUNT(), который я для примера привёл? Общий смысл таков, что кол-во строк надёжнее (и, внезапно, быстрее) получить на сервере, и передать его с остальными рекордсетами.

По второму пункту, есть мнение, что дело в Connection(добавить выделенное)

авторcn.ConnectionString = "Provider=SQLOLEDB.1;Password=KLjmj988;Persist Security Info=True;User ID=sa;Data Source=ANALITIKI"
сn.CursorLocation =adUseClient
cn.Open
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37812214
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElenHimнескромный вопрос, вы много способов умеете посчитать кол-во строк результирующего запроса на стороне сервера а что, я разве что-то говорил про сторону сервера? Автор как раз хочет посчитать на стороне клиента.


ElenHimПо второму пункту, есть мнение, что дело в Connection(добавить выделенное)
авторcn.ConnectionString = "Provider=SQLOLEDB.1;Password=KLjmj988;Persist Security Info=True;User ID=sa;Data Source=ANALITIKI"
сn.CursorLocation =adUseClient
cn.Openнет, CursorType и CursorLocation - это разные вещи.

ЗЫ: Очень жду когда придет White Owl и скажет что-нить умное. )
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37812316
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proа что, я разве что-то говорил про сторону сервера?
Вот как? Как же тогда понимать ваше вопиющие недоумение:

Shocker.ProОсобенно офигенно получается, если запрос выполняется, скажем, минуту.
Еще минуту потратить только на то, чтобы посчитать количество записей.
Не, ну можно, конечно, для ускорения сделать временную таблицу и т.п.
Если автор скажет, какие цели у него и какие вариации допустимы, то можно посоветовать обходные пути.
Или вы под выделенным имели ввиду клиент? Как тогда вы собирались считать?

А здесь вы вообще отожгли:

Shocker.Proнет, CursorType и CursorLocation - это разные вещи.

- На это можно ответить только одно: люблю картошку фри.

А вот про сn.CursorLocation = adUseClient я написал потому, что в моём примере именно эта строка позволила вывести recordcount для Set rs = cmd.Execute() (причём моя sp возвращает мульти рекордсэт)

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Function System_Data_Import() As ADODB.Recordset
Set cmd = New ADODB.Command
Set cn = New ADODB.Connection

With cn
    .ConnectionString = Current_Connection_String
    .CursorLocation = adUseClient ' без этого System_Data_Import.RecordCount = -1
    .ConnectionTimeout = 200
    .Open
End With
With cmd
    .ActiveConnection = cn
    .CommandText = "eva.stp_Eva_System_Data_Import"
    .CommandType = adCmdStoredProc
    .Parameters.Refresh
    .Parameters("@Company_Idn") = Current_Company_ID
    .Parameters("@Section_Idn") = Current_Section_ID
    Set System_Data_Import = .Execute()
    Debug.Print System_Data_Import.RecordCount
End With
End Function
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37812350
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElenHim, я вообще мало что понял из ваших бессвязных наездов.

Но таки-да, автору вполне может помочь использование клиентского курсора, только применять его надо не к несуществующему рекордсету, а к коннекшну как в вашем примере.
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37812378
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Впрочем, проехалиShocker.ProElenHim, я вообще мало что понял из ваших бессвязных наездов


Неудивительно, ведь чтобы понять что
Shocker.Pro применять его надо не к несуществующему рекордсету, а к коннекшну как в вашем примере.
Понадобилось дополнительно 2 поста.



Есть некоторые соображения, почему так.

В случае set rs = cmd.Execute(), мы по идее получаем совершенно новый рекордсет, а нет тот что мы определяли ранее:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
With rs
.CursorType = adOpenStatic
.LockType = adLockOptimistic
.CursorLocation = adUseClient
End With



и этому новому рекордсету ничего неизвестно о наших пожеланиях (типа adOpenStatic,adLockOptimistic,adUseClient)
Сообщить эти наши пожелания можно через Connection, тогда рекордсет-результат унаследует их от соответствующего connection
и recordcount заработает

-Насколько удалось понять из описания модели ADO
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37812390
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElenHimНеудивительно, ведь чтобы понять что...
Понадобилось дополнительно 2 поста.ElenHimЕсть некоторые соображения, почему так.
В случае set rs = cmd.Execute(), мы по идее получаем совершенно новый рекордсет, а нет тот что мы определяли ранее:
ниче, что я написал об этом сразу? 12614937
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37812411
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro ниче, что я написал об этом сразу?



Получается, что ниче. Или это к чему-то привело?
Тем более что

Shocker.Proэто просто комментарий, как оказалось, я не знаю ответ на этот вопрос, всегда пользовался только ForwardOnly, сходу нужных опций не нашел

В итоге я идею развил. И это уже - че
...
Рейтинг: 0 / 0
Не могу получить кол-во строк rs.RecordCount
    #37814240
Minch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElenHim, Shocker.Pro,
Спасибо, огромное. Прописал .CursorLocation = adUseClient и стало работать корректно.
Да, достаточно неудобно то что при присвоении rs=cmd.execute создается новый рекордсет с параметрами по умолчанию.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Не могу получить кол-во строк rs.RecordCount
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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