|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 12:56 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
Пробовал добавлять перед a = rs.RecordCount, выражение rs.movelast Выдает ошибку "набор строк не поддерживает обратную выборку." ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 12:58 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
Еще обнаружил что .CursorType = adOpenStatic, после выполнения команды Set rs = cmd.Execute() меняется на CursorType = adOpenForwardOnly поэтому и не работает rs.movelast, в следствие чего не могу определить rs.RecordCount Вопрос: как избежать перемены CursorType ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 13:16 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
Command.Execute возвращает объект Recordset, поэтому строки Код: vbnet 1. 2. 3. 4. 5. 6.
не нужны в принципе и ни на что не влияют это просто комментарий, как оказалось, я не знаю ответ на этот вопрос, всегда пользовался только ForwardOnly, сходу нужных опций не нашел ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 13:37 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
Minch, при объявлении CommandType = adCmdStoredProc возвращаемое значение можно извлечь только из выходящего параметра хранимой процедуры если такое имеется а набор записей не возвращается, поэтому и ошибка о закрытом рекордсете. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 13:52 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
Oleg_Slip, у ТС другая проблема, рекордсет открытые, но не поддерживает Backward ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 14:01 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
Shocker.Pro, проблема в том что rs.RecordCount выдает -1 и это потому что рекордсет пуст и не может быть заполнен в силу описанных мною выше причин. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 14:14 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
Oleg_Slip, ниче подобного. rs.RecordCount выдает -1 потому что ForwardOnly, при этом Set rs = cmd.Execute() преспокойно возвращает нормальный заполненный рекордсет, у которого невозможно определить количество записей по вышеуказанной причине. Вопрос только в том, как заставить cmd.Execute вернуть Static или KeySet ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 14:18 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
Shocker.Pro, Ты полностью прав. Set rs = cmd.Execute() возвращает заполненный рекордсет. Его можно посмотреть выведя rs.getstring В выводимых данных больше одной строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 14:33 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
Полный синтаксис данной конструкции выглядит так: Set recordset = command.Execute( RecordsAffected, Parameters, Options ) подробно об этом - на MSDN ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 14:55 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
ElenHim, Верно, но какой именно параметр за это отвечает? Я не нашел ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 14:58 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
Мдась, немного перепутал( 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 16:21 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
ElenHim, Особенно офигенно получается, если запрос выполняется, скажем, минуту. Еще минуту потратить только на то, чтобы посчитать количество записей. Не, ну можно, конечно, для ускорения сделать временную таблицу и т.п. Если автор скажет, какие цели у него и какие вариации допустимы, то можно посоветовать обходные пути. Но меня как раз интересует вопрос в первоначальной постановке автора: Для Recordset.Open можно задать тип курсора. Можно ли (и как) задать его для Command.Execute или для Connection.Execute? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 16:28 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 17:00 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
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 и скажет что-нить умное. ) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 17:12 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 17:50 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
ElenHim, я вообще мало что понял из ваших бессвязных наездов. Но таки-да, автору вполне может помочь использование клиентского курсора, только применять его надо не к несуществующему рекордсету, а к коннекшну как в вашем примере. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 18:05 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
Shocker.Pro, Впрочем, проехалиShocker.ProElenHim, я вообще мало что понял из ваших бессвязных наездов Неудивительно, ведь чтобы понять что Shocker.Pro применять его надо не к несуществующему рекордсету, а к коннекшну как в вашем примере. Понадобилось дополнительно 2 поста. Есть некоторые соображения, почему так. В случае set rs = cmd.Execute(), мы по идее получаем совершенно новый рекордсет, а нет тот что мы определяли ранее: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
и этому новому рекордсету ничего неизвестно о наших пожеланиях (типа adOpenStatic,adLockOptimistic,adUseClient) Сообщить эти наши пожелания можно через Connection, тогда рекордсет-результат унаследует их от соответствующего connection и recordcount заработает -Насколько удалось понять из описания модели ADO ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 18:24 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
ElenHimНеудивительно, ведь чтобы понять что... Понадобилось дополнительно 2 поста.ElenHimЕсть некоторые соображения, почему так. В случае set rs = cmd.Execute(), мы по идее получаем совершенно новый рекордсет, а нет тот что мы определяли ранее: ниче, что я написал об этом сразу? 12614937 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 18:30 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
Shocker.Pro ниче, что я написал об этом сразу? Получается, что ниче. Или это к чему-то привело? Тем более что Shocker.Proэто просто комментарий, как оказалось, я не знаю ответ на этот вопрос, всегда пользовался только ForwardOnly, сходу нужных опций не нашел В итоге я идею развил. И это уже - че ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2012, 18:44 |
|
Не могу получить кол-во строк rs.RecordCount
|
|||
---|---|---|---|
#18+
ElenHim, Shocker.Pro, Спасибо, огромное. Прописал .CursorLocation = adUseClient и стало работать корректно. Да, достаточно неудобно то что при присвоении rs=cmd.execute создается новый рекордсет с параметрами по умолчанию. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2012, 12:06 |
|
|
start [/forum/topic.php?fid=61&fpage=100&tid=2175681]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 169ms |
0 / 0 |