powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
18 сообщений из 18, страница 1 из 1
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32808589
Фотография Andrey13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое

НЕ МОГУ ПОНЯТЬ В ЧЕМ ДЕЛО!


Программа:

Dim conn As ADODB.Connection
Dim rs As New ADODB.Recordset

Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data/kvartplata.mdb;Persist Security Info=True"

conn.Open "data/Kvartplata.mdb"



Set rs = New ADODB.Recordset
Set rs.ActiveConnection = conn
rs.CursorType = adOpenForwardOnly
rs.LockType = adLockBatchOptimistic
rs.Open ("SELECT OtheOwner.FAM, OtheOwner.OT, OtheOwner.IM FROM OtheOwner")

While (Not rs.EOF)
rs("ot") = "Иванович" ' Ошибка в этой строке
rs.MoveNext
Wend
rs.UpdateBatch
rs.Close
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32808590
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adOpenForwardOnly

Этот тип курсора только для чтения. Используй статический.

Magnus
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32808606
Фотография Andrey13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем кто потратил свое время. Отвечаю сам себе

Lg.CursorType = adOpenDynamic


Далее текст написан не мной но оказался полезен, может кому поможет


Во-первых, что такое курсор. Когда мы получаем записи, то нам нужен указатель на то, какая запись активная. Вот это и есть курсор. Мы передвигаясь по записям можем выйти за первую запись или за последнюю. Для этого у объекта Recordset есть специальные свойства.

BOF - вышли за начало
EOF - вышли за конец
Перемещаться по записям можно используя методы MoveNext, MoveFirst, MoveLast, MovePrevious, Move. Есть и другие методы типа AbsolutePosition, но они не обязательные и зависят от того поддерживает их OLEDB провайдер или нет. Курсор как раз и определяет как можно перемещаться по записям. В ADO существует 4 типа курсоров:

аdOpenDynamic - это самый удачный курсор для многопользовательской среды, сразу видны изменения вносимые другими пользователями.

аdOpenKeyset - все то же самое, что и для динамического за исключением того, что доступ к записям добавленным или удаленным другими пользователями запрещен.

аdOpenStatic - набор на момент генерации запроса.

аdOpenForwardOnly - набор записей с последовательным доступом. Доступен только один метод MoveNext.

Как видите каждый курсор для своей задачи. Последние два методы плохи тем, что они показывают фиксированный набор на момент доступа. Соответственно должен быть метод для обновления записей. И он есть, метод Reguery обновляет набор. Тип курсора указывается при открытии набора записей. В примере ниже открывается набор записей с динамическим курсором, но при таком подходе нужно указать объект активного соединения.

record.Open "select * from piple",adoConnect,adOpenDynamic

Если курсор не указывать, то по умолчанию он будет adOpenForwardOnly.
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32808662
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм. Да.

У тебя "многопользовательская среда"? Если нет то статического курсора вполне достаточно. Это раз. При динамическом курсоре он всегда находится на стороне сервера и никаких rs.UpdateBatch не получится. Это два-с. При динамическом курсоре ты не увидишь количество записей в рекордсете пока не пробежишь его до конца. Это три-с. Да еще много чего.

Вот я и говорю, используй статический и будет тебе щасте .


Magnus
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32809579
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Magnus23 При динамическом курсоре он всегда находится на стороне сервера и никаких rs.UpdateBatch не получится.

Насколько я знаю связи между пакетным обновлением и типом курсора нет.

Это зависит только от типа блокировки...

Пример с MSDN.

adOpenKeyset не имеет ничего общего со статическим курсором...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
    ' open recordset for batch uodate
   Set rstTitles = New ADODB.Recordset
   strSQLTitles = "titles"
   rstTitles.Open strSQLTitles, Cnxn, adOpenKeyset, adLockBatchOptimistic, adCmdTable
   
   rstTitles.MoveFirst
   ' Loop through recordset and ask user if she wants
   ' to change the type for a specified title.
   Do Until rstTitles.EOF
      
      If Trim(rstTitles!Type) = "psychology" Then
         strTitle = rstTitles!title
         strMessage = "Title: " & strTitle & vbCr & _
            "Change type to self help?"

         If MsgBox(strMessage, vbYesNo) = vbYes Then
            rstTitles!Type = "self_help"
         End If
      End If

   rstTitles.MoveNext
   Loop

   ' Ask the user if she wants to commit to all the
   ' changes made above.
   If MsgBox("Save all changes?", vbYesNo) = vbYes Then
      rstTitles.UpdateBatch
   Else
      rstTitles.CancelBatch
   End If


Если не прав, давайте разберемся :-)... Истина рождается в споре
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32809827
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я знаю связи между пакетным обновлением и типом курсора нет.
Есть. Динамический курсор находится на сервере и естественно все обновления проводятся моментально, прямо в базу, поэтому и не получится пакетного обновления.


adOpenKeyset
Это не есть динамический курсор, это статический с расширенными возможностями. Расположен на клиенте, поэтому обновление пакета прокатывает.



Magnus
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32809998
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Magnus23
Это не есть динамический курсор, это статический с расширенными возможностями. Расположен на клиенте, поэтому обновление пакета прокатывает.


В MSDN я этого не нашел. Чесс слово.

Что же касается "расположен на клиенте"...

Откуда из приведенного мною примера видно, что курсор расположен на клиенте? Никаких спец. указаний нет, а по умолчанию курсор - серверный...

Разве нет?

P.S.
ADO Cursor Settings
...
CursorLocation Default: adUseServer
Sets or returns the location of the cursor engine.
If you set this property to adUseClient, you can open only a static cursor .

P. S. S.
Use an ADO client cursor (set the CursorLocation property to adUseClient).
ADO implements the cursor; therefore, the application can use only the capabilities supported by the ADO client cursors. The application cannot access the cursor capabilities of the underlying provider. Only a CursorType property of adOpenStatic (static cursor) is supported for a setting of adUseClient.
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32810068
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На счетadOpenKeyset я немного погарячился, это типа динамический но не совсем. :).


МСДН:

Note Although Supports(adUpdateBatch) may be true for dynamic and forward-only cursors, for batch updates you should use either a keyset or static cursor. Set the LockType property to adLockBatchOptimistic, and the CursorLocation property to adUseClient to enable the Microsoft Client Cursor Engine, which is required for batch updates.

Remote Data Service Usage When used on a client-side (ADOR) Recordset object, the CursorType property can be set only to adOpenStatic.


Magnus
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32810071
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче что то среднее между статическим и динамическим :)


Magnus
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32813294
Фотография Andrey13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да озадачели. Так что делать? Среда многопользовательская.
А adOpenDynamic это только потеря в быстродействии на сколько я понимаю?

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

Еще вопрос UpdateBatch при adOpenDynamic, это то же что

Conn.Execute("UPDATE ...") или я совсем не понимаю о чем говорю?

Объясните пожалуйста.
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32814775
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При димнамическом курсоре изменения в базу вносятся моментально. А UpdateBatch остаются на клиенте до момента вызова этого самого UpdateBatch.

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

Проще конечно работать со статическим и при9 апдейте проверять была ли строка изменена или удалена.


Magnus
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32815466
Фотография Andrey13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и так прогр. не "летает", а если еще проверять... На сколько я понял без проверки не обойтись, ошибка выдается только если не обновлено ни одной записи, а если 50 % обновления прошло то ошибки не будет.

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

conn.Execute ("UPDATE Doc SET Doc.Summa =5... while a<>b)

или

if F<>b then
Rs.fields("Summa").value =5

Rs.update ' В зависимости от типа курсора
end if

Во втором случае еще надо время и на открытие RecordSet,перебор записей,сравнение. Хотя и в первом наверное происходит то же самое.
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32815495
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в следующем товарищ майор, такие вещи хранимками нужно делать ИМХО, если хочется скорости. И проверять все на сервере, возвращая назад ошибку.

Кстати
Код: plaintext
UPDATE Doc SET Doc.Summa = 5 ... where a<>b
и в хранимку с параметром.


Далее. Если нужно таки пакетное обновление, а ТАКЖЕ целостность данных, то использовать транзакции, при ошибке - полный откат. Дешево и со вкусом.

Magnus
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32815496
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, не понял, 50% обновления катит?

Magnus
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32817650
Фотография Andrey13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НА СЧЕТ 50 %

СУТЬ В ТОМ ЧТО ЕСЛИ МЫ ОБНОВЛЯЕМ НЕСКОЛЬКО ЗАПИСЕЙ

RS.FIELDS("fIeld1").VALUE=1
rs.FIELDS("fIeld2").VALUE=2
rs.FIELDS("fIeld3").VALUE=3

А ПОТОМ UPDATE, ТО ЕСЛИ fIeld1 ОБНОВИТСЯ, А fIeld2, И fIeld3 НЕТ, ТО vb ЩШИБКИ НЕ ВЫДАСТ.

НО ВОТ ГДЕ Я ЭТУ ИСТИНУ ПОЧЕРПНУЛ НЕ МОГУ ВСПОМНИТЬ. И ИСТИНА ЛИ ЭТО.
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32817652
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погоди, тут надо исходить не из того чего там васик показывает, а из того что нужно ТЕБЕ. Сделать то можно все что угодно. Все зависит от условий, критичности по времени, затратам и т.п.

Magnus
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32817659
Фотография Andrey13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно быть уверенным на 100%, что если я дал команду rs.UpdateBatch то
этот UpdateBatch произошел, а если всетаки нет, то хотя бы я увидел окно ошибки и попытался повторить операцию.
Вобщем у меня базовые знания по этому вопросу маловаты поэтому и спрашиваю. Буду благодарен если даш совет какую книгу стоит прочесть не потеряв времени даром.
...
Рейтинг: 0 / 0
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
    #32819451
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Майк Гандерлой
ADO и Visual Basic
http://www.sybex.com

Там предлагается так ловить несохранившиеся записи:
Применть фильтр на рекордсет (или клона)
rs.filter = adFilterConflictingRecords

другие фильтры:
adFilterPendingrecords - Изменения, непосланные серверу.
adFilterAffectedRecords - записи измененные Delete, Resync, UpdateBatch или CancelBatch
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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