|
|
|
| Доброго времени суток.
Проблема следующая:
В Access 2003 имеется форма
В модуле формы объявлены переменные:
Dim rs As New ADODB.Recordset, cnn As New ADODB.Connection
При открытии формы:
Private Sub Form_Open(Cancel As Integer)
cnn.ConnectionString = "LPU" 'Источник данных ODBC
cnn.Open
rs.CursorLocation = adUseClient
rs.Open "SELECT IDKARTA, DATBEG FROM KARTA , cnn, adOpenKeyset, adLockBatchOptimistic 'IDKARTA - ключ
rs.ActiveConnection = Nothing
Set Me.Recordset = rs
End Sub
Работа, изменение данных.
При нажатии кнопки хочу записать изменения:
Private Sub Кнопка5_Click()
rs.ActiveConnection = cnn
Set rs = Me.RecordsetClone
rs.UpdateBatch
End Sub
Проблема:
При нажатии кнопки сохраняются изменения только в непосредственно редактируемой записи. Внесенные изменения в несколько записей не сохраняются. Надеялся увеличить быстродействие формы, но наверное метод UpdateBatch на это не расчитан? | |
|
| |
|
|
|
| Мoжет дело в ODBC?
Нельзя "LPU" 'Источник данных ODBC - заменить на OLEDB? | |
|
| |
|
|
|
| ODBC провайдер поддерживает UpdateBatch, это не должно валить записи
Set rs = Me.RecordsetClone
|
а вот это зачем? - непонятно | |
|
| |
|
|
|
| В общем то "Set rs = Me.RecordsetClone ", наверное, действительно лишнее. Но результат остается прежний если оставить просто "rs.UpdateBatch"
База данных в Sybase Aniwhere 5.0. По-моему, кроме как через ODBC, к ней не присоединиться. | |
|
| |
|
|
|
| Не работал UpdateBatch в Sybase Aniwhere 5.0., только SQLServer. Попробую дать рекомендации:
- проверить после открытия рекордсета Debug.Print rs.LockType. Если провайдер не поддерживает пакетное обновление, то тип блокировки будет установлен по умолчанию
- сохранить (UpdateBatch) рекордсет с несколькими изменёнными(добавленными, удалёнными) Вашей формой записями в файл, а потом открыть и посмотреть, есть ли то что Вам нужно, т.е. убедиться что форма работает
- перед открытием пропиcать rs.UniqueTable = "KARTA"
- переходить на SQLServer | |
|
| |
|
|
|
| Добрый день. Выполнил рекомендации.
1. rs.LockType=4
2. Сохранил рекордсет в файл - внесенные изменения сохраняются.
3. Прописал me.UniqueTable = "KARTA"
4. Сделал таблицу в SQL Server
Результат при работе в таблице в SQL Server такой же. Обновить несколько записей, измененных в форме не удалось, хотя, если пройтись в цикле по рекордсету:
Dim i As Integer
rs.MoveLast
rs.MoveFirst
For i = 1 To rs.RecordCount
rs!DATBEG = "какое-то значение"
rs.MoveNext
Next i
rs.ActiveConnection = cnn ' Восстанавливаем соединение
rs.UpdateBatch ' Пакетное обновление
Все прекрасно обновляется.
Думаю, что пакетное обновление через форму в ACCESS просто не реализовано...
Появились идеи насчет метода Recync. Кажется что-то получается...
Ничего не получается. После первого вызова Recync данные в форме приводятся в соответствие с базой данных, т. е. все все изменения отменяются (или остаются. если параметр resyncvalues=adResyncUnderlyingValues). А в последующем форма работает без всякого UpdateBatch - все изменения сохраняются.
Не хочется отказыватся от этой идеи поскольку имею дело с большими базами данных (тем более Sybase 5.0). Быстродействие оставляет желать лучшего (мягко сказано). | |
|
| |