adodb updateBatch хранит неверную информацию - PullRequest
0 голосов
/ 25 октября 2011

У меня есть программа VB6, использующая наборы записей adodb и файл базы данных Microsoft Access 2007;Я добавил код в приложение, которое принимает каждую запись в таблице, и для большинства записей в таблице я беру одно поле, вычисляю новое значение на основе значения в этом поле и сохраняю это значение в другом поле в той же записи.,Я проверил это и запустил в производство;он работает без (с сообщением) ошибки на большом количестве ноутбуков.

Сегодня я получил сообщение об ошибке;насколько я могу судить, метод updateBatch в наборе записей хранит немного другое значение, чем то, которое я там поместил, и, конечно, отличается от того, которое я намеревался поместить туда.Я поместил его в отладчик и убедился, что мне нужно новое значение;Я поместил в операторы, которые записывают базовое значение и новое значение в файл, и проверил, что ЭТО - то, что я хочу, и все же различные значения попадают в базу данных.

Вот соответствующий цикл:

sqlStr = "Select key_citation, long_citeIndex from citation"
Set rs = m_dbh.runSQLReturnRS_RW(sqlStr)
While Not rs.EOF
    citationNumber = rs.Fields("key_citation").value
    If Left$(citationNumber, 1) <> "W" Then
        newIndex = Citation.calculateCiteIndex(citationNumber)
        Open "c:\CitationIndexDebug.txt" For Append As #4
        Write #4, citationNumber, newIndex
        Close #4
        rs.Fields("long_citeIndex").value = newIndex
    End If
    rs.MoveNext
Wend
rs.UpdateBatch
rs.Close
Set rs = Nothing

runSQL и т. Д. Открывает набор записей с помощью adOpenDynamic, adLockBatchOptimistic

Я пытался вставить rs.Update для каждой записи,но это, похоже, не работает вообще;Я предполагаю, что, поскольку остальная часть приложения использует updateBatch, операторы runSQL открывают наборы записей, предполагая пакетное обновление.

У кого-нибудь есть какие-либо идеи, почему это было бы неправильно, и неправильно только в небольшом проценте времени?Как я уже сказал, он работает правильно, насколько я могу судить по десяткам / сотням машин, и затем имеет ошибку в этой конкретной базе данных.

Ответы [ 2 ]

0 голосов
/ 26 октября 2011

В качестве альтернативы вы можете получить набор записей с помощью adOpenForwardOnly, а затем отправить операторы UPDATE SQL. Я изобрел m_conn , но это должен быть объект ADO.Connection.

 sqlStr = "SELECT key_citation FROM citation"
 Set rs = m_conn.Execute(sqlStr, , adCmdText Or adOpenForwardOnly)
 While Not rs.EOF
     citationNumber = rs.Fields(0).Value
     If Left$(citationNumber, 1) <> "W" Then
         newIndex = Citation.calculateCiteIndex(citationNumber)
         m_conn.Execute "UPDATE citation SET long_citeIndex = " & CStr(newIndex) & " WHERE key_citation = " & CStr(citationNumber), , adCmdText
     End If
     rs.MoveNext
 Wend rs.UpdateBatch
 rs.Close
 Set rs = Nothing
0 голосов
/ 25 октября 2011

Чем значение немного отличается от того, что вы намереваетесь сохранить? Можете ли вы привести несколько примеров того, что это должно быть и как оно на самом деле сохраняется?

...