Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое / 18 сообщений из 18, страница 1 из 1
02.12.2004, 01:24:13
    #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
02.12.2004, 01:30:46
    #32808590
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
adOpenForwardOnly

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

Magnus
...
Рейтинг: 0 / 0
02.12.2004, 02:34:04
    #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
02.12.2004, 06:31:09
    #32808662
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
Хм. Да.

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

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


Magnus
...
Рейтинг: 0 / 0
02.12.2004, 13:47:48
    #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
02.12.2004, 15:03:13
    #32809827
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
Насколько я знаю связи между пакетным обновлением и типом курсора нет.
Есть. Динамический курсор находится на сервере и естественно все обновления проводятся моментально, прямо в базу, поэтому и не получится пакетного обновления.


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



Magnus
...
Рейтинг: 0 / 0
02.12.2004, 15:57:15
    #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
02.12.2004, 16:19:59
    #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
02.12.2004, 16:20:47
    #32810071
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
Короче что то среднее между статическим и динамическим :)


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

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

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

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

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

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

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


Magnus
...
Рейтинг: 0 / 0
07.12.2004, 00:40:25
    #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
07.12.2004, 05:26:05
    #32815495
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
Дело в следующем товарищ майор, такие вещи хранимками нужно делать ИМХО, если хочется скорости. И проверять все на сервере, возвращая назад ошибку.

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


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

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

Magnus
...
Рейтинг: 0 / 0
08.12.2004, 01:33:10
    #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
08.12.2004, 01:39:22
    #32817652
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
Погоди, тут надо исходить не из того чего там васик показывает, а из того что нужно ТЕБЕ. Сделать то можно все что угодно. Все зависит от условий, критичности по времени, затратам и т.п.

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

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

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


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