Добавить несколько записей, а потом UpdateBatch

udav2alex
Дата: 26.11.2006 00:00:41
Можно ли в ADODB.Recordset добавить несколько записей, а потом проапдейтить?

    Dim rstEv As ADODB.Recordset   
    Set rstEv = New ADODB.Recordset
    rstEv.Open "Events", CurrentProject.Connection, adOpenKeyset, adLockBatchOptimistic

    . . .
    
    for a=1 to 10
        rstEv.AddNew
        rstEv.Fields("EvAuthor").Value = <<нечто вычисляемое>>
    next a
  
    rstEv.UpdateBatch adAffectAll

Таблица Events содержит индекс и одно поле, которое вычисляется программно.

После первого прохода цикла (когда а=2) Access ругается, говорит "Число строк с предполагаемыми изменениями превышает предельно допустимое", т.е. не дает сделать даже второй AddNew. Может так вообще делать нельзя? Подскажите, пожалуйста, где копать...
Alexander G
Дата: 26.11.2006 05:17:43
Dim rstEv As ADODB.Recordset
Dim cnn As ADODB.Connection
Set cnn = CurrentProject.Connection
cnn.CursorLocation = adUseClient
Set rstEv = New ADODB.Recordset
rstEv.Open "Events", cnn, adOpenKeyset, adLockBatchOptimistic

    . . .
    
    for a=1 to 10
        rstEv.AddNew
        rstEv.Fields("EvAuthor").Value = <<нечто вычисляемое>>
    next a
  
    rstEv.UpdateBatch adAffectAll
udav2alex
Дата: 26.11.2006 16:09:31
Alexander G, спасибо за помощь - помогло, но не до конца...

При создании новой записи с помощью rstEv.AddNew счетчик индексного поля всегда начинает отсчет с еденицы! Т.е. если таблица пустая первое выполнение процедуры дает нужный результат - добавляются записи. Во время второго прохода rstEv.UpdateBatch ругается: "Изменения не были успешно внесены из-за повторяющихся значений в индексе...". И действительно, я посмотрел во время выполнения процедуры во второй раз индексному полю снова устанавливается еденица.

Подскажите, как установить счетчик правильно, пожалуйста.
NG
Дата: 26.11.2006 16:18:00
Подскажите, как установить счетчик правильно, пожалуйста.

Если в вашем запросе есть поле счетчика, то удалите его (наверно будет другой запрос).
udav2alex
Дата: 26.11.2006 16:33:16
Вах-вах-вах!!! Помогло! Спасибо огромное!

Кстати, может, кто-нибудь знает как кратко написать SQL-запрос, который будет извлекать все поля кроме одного? Т.е. было

SELECT * FROM Events;

а мне надо

SELECT <<* кроме поля EvID>> FROM Events;

Сейчас в коде просто перечислил все поля кроме EvID, но это как-то совсем некрасиво. Как вариант можно строку SQL-запроса построить программно перечислив все поля кроме одного... Может есть более гуманные способы? Заранее благодарю ;)
NG
Дата: 26.11.2006 16:47:00
Повторюсь:
(наверно будет другой запрос)

-- другого пути нет.
udav2alex
Дата: 26.11.2006 18:51:27
Да, спасибо ;)

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

Но тут столкнулся с одной фишкой, которая, насколько я понимаю, для сведующих совсем и не фишка. Когда у меня запрос был со счетчиком, я руками его установил в "1". Потом, как было сказано, из запроса я счетчик не исключил, но счетчик при этом стал "2". Т.е. при добавлении мной записи он увеличился на 1 и теперь даже при попытке добавить запись просто через форму Access ругается на повторение в поле счетчика (т.к. записть номер 2 уже есть).

Я не долго думая тем же способом (можно сказать "руками") выставил счетчик на 1000 - все теперь нормально. Вопрос вот в чем: как избежать ситуации, что сам счетчик при инкременте не обходит существующее значение и тупо прибавляет 1.

Что можете тут посоветовать кроме "не трогай счетчики" ;)
Где про это можно почитать?
udav2alex
Дата: 26.11.2006 18:52:47
упс... очепятка:

из запроса я счетчик как раз исключил