|
|
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое НЕ МОГУ ПОНЯТЬ В ЧЕМ ДЕЛО! Программа: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2004, 01:24:13 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
adOpenForwardOnly Этот тип курсора только для чтения. Используй статический. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2004, 01:30:46 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
Спасибо всем кто потратил свое время. Отвечаю сам себе 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2004, 02:34:04 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
Хм. Да. У тебя "многопользовательская среда"? Если нет то статического курсора вполне достаточно. Это раз. При динамическом курсоре он всегда находится на стороне сервера и никаких rs.UpdateBatch не получится. Это два-с. При динамическом курсоре ты не увидишь количество записей в рекордсете пока не пробежишь его до конца. Это три-с. Да еще много чего. Вот я и говорю, используй статический и будет тебе щасте . Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2004, 06:31:09 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
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. Если не прав, давайте разберемся :-)... Истина рождается в споре ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2004, 13:47:48 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
Насколько я знаю связи между пакетным обновлением и типом курсора нет. Есть. Динамический курсор находится на сервере и естественно все обновления проводятся моментально, прямо в базу, поэтому и не получится пакетного обновления. adOpenKeyset Это не есть динамический курсор, это статический с расширенными возможностями. Расположен на клиенте, поэтому обновление пакета прокатывает. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2004, 15:03:13 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2004, 15:57:15 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
На счет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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2004, 16:19:59 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
Короче что то среднее между статическим и динамическим :) Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2004, 16:20:47 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
Да озадачели. Так что делать? Среда многопользовательская. А adOpenDynamic это только потеря в быстродействии на сколько я понимаю? Вообще использую это только при расчете, который должен происходить по плану раз в месяц. Еще вопрос UpdateBatch при adOpenDynamic, это то же что Conn.Execute("UPDATE ...") или я совсем не понимаю о чем говорю? Объясните пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2004, 05:04:56 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
При димнамическом курсоре изменения в базу вносятся моментально. А UpdateBatch остаются на клиенте до момента вызова этого самого UpdateBatch. Вообще вопрос сложный. Много всяких заковык, реализация зависит от критиности данных в первую очередь. Если уж использовать динамический курсор для внесения изменений то и отображать надо наиболее актуальные данные. Проще конечно работать со статическим и при9 апдейте проверять была ли строка изменена или удалена. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2004, 16:01:40 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
Да и так прогр. не "летает", а если еще проверять... На сколько я понял без проверки не обойтись, ошибка выдается только если не обновлено ни одной записи, а если 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,перебор записей,сравнение. Хотя и в первом наверное происходит то же самое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 00:40:25 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
Дело в следующем товарищ майор, такие вещи хранимками нужно делать ИМХО, если хочется скорости. И проверять все на сервере, возвращая назад ошибку. Кстати Код: plaintext Далее. Если нужно таки пакетное обновление, а ТАКЖЕ целостность данных, то использовать транзакции, при ошибке - полный откат. Дешево и со вкусом. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 05:26:05 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
Кстати, не понял, 50% обновления катит? Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 05:26:51 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
НА СЧЕТ 50 % СУТЬ В ТОМ ЧТО ЕСЛИ МЫ ОБНОВЛЯЕМ НЕСКОЛЬКО ЗАПИСЕЙ RS.FIELDS("fIeld1").VALUE=1 rs.FIELDS("fIeld2").VALUE=2 rs.FIELDS("fIeld3").VALUE=3 А ПОТОМ UPDATE, ТО ЕСЛИ fIeld1 ОБНОВИТСЯ, А fIeld2, И fIeld3 НЕТ, ТО vb ЩШИБКИ НЕ ВЫДАСТ. НО ВОТ ГДЕ Я ЭТУ ИСТИНУ ПОЧЕРПНУЛ НЕ МОГУ ВСПОМНИТЬ. И ИСТИНА ЛИ ЭТО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 01:33:10 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
Погоди, тут надо исходить не из того чего там васик показывает, а из того что нужно ТЕБЕ. Сделать то можно все что угодно. Все зависит от условий, критичности по времени, затратам и т.п. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 01:39:22 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
Мне нужно быть уверенным на 100%, что если я дал команду rs.UpdateBatch то этот UpdateBatch произошел, а если всетаки нет, то хотя бы я увидел окно ошибки и попытался повторить операцию. Вобщем у меня базовые знания по этому вопросу маловаты поэтому и спрашиваю. Буду благодарен если даш совет какую книгу стоит прочесть не потеряв времени даром. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 02:41:14 |
|
||
|
Помогите Ошибка: Число строк с предпологаемыми изменениями превышает предельно допустимое
|
|||
|---|---|---|---|
|
#18+
Майк Гандерлой ADO и Visual Basic http://www.sybex.com Там предлагается так ловить несохранившиеся записи: Применть фильтр на рекордсет (или клона) rs.filter = adFilterConflictingRecords другие фильтры: adFilterPendingrecords - Изменения, непосланные серверу. adFilterAffectedRecords - записи измененные Delete, Resync, UpdateBatch или CancelBatch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 18:20:19 |
|
||
|
|

start [/forum/topic.php?fid=60&gotonew=1&tid=2168474]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
7ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 304ms |

| 0 / 0 |
