powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Модификация полей ADODB.Recordset
8 сообщений из 8, страница 1 из 1
Модификация полей ADODB.Recordset
    #33583583
pr0teus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть программа для работы с базой данных Visual Fox Pro. В определенный момент необходимо модифицировать записи из выборки, делается это у меня так
Код: 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.
' выборка
If (l_objRecordSetSecond.State = adStateOpen) Then l_objRecordSetSecond.Close
l_objRecordSetSecond.Open "SELECT act, state, owncenterid, date FROM " & ConnectionParam.strTJL & _
                                      " WHERE tableid=" & l_TableID & _
                                      " .AND. dbid=" & l_DBID & _
                                      " .AND. recid=" & l_RECID & _
                                      " .AND. act<>'P'" & _
                                      " .AND. state>=0" & _
                                      " .AND. owncenterid<>" & l_DBIDinPackage, _
                                      l_objDBCConnection, adOpenDynamic, adLockOptimistic

' ...
' другой код
' ...

' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
' тут почему-то происходило зацыкливание  !!!!!!
' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Do Until l_objRecordSetSecond.EOF
       l_objRecordSetSecond.Fields("state").Value = - 1 
       l_objRecordSetSecond.Update
       If (Err <>  0 ) Then
              l_objLog.m_WriteLine "Ошибка. е удалось модифицировать запись в журнале. " & Err.Description
              l_flagWasError = True
              Err.Clear
              End If
              l_objRecordSetSecond.MoveNext
Loop


В последнем коде происходило зацикливание и из-за чего это было не понятно ?(

Но после того как исправил выбоку, всего лишь добавив еще одно поле для вывода ( SELECT act, state, owncenterid, date, centerid ), все стало нормально работать. Это глюк чтоли или я что-то неверно делаю?

Код: 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.
' выборка
If (l_objRecordSetSecond.State = adStateOpen) Then l_objRecordSetSecond.Close
l_objRecordSetSecond.Open "SELECT act, state, owncenterid, date, centerid FROM " & ConnectionParam.strTJL & _
                                      " WHERE tableid=" & l_TableID & _
                                      " .AND. dbid=" & l_DBID & _
                                      " .AND. recid=" & l_RECID & _
                                      " .AND. act<>'P'" & _
                                      " .AND. state>=0" & _
                                      " .AND. owncenterid<>" & l_DBIDinPackage, _
                                      l_objDBCConnection, adOpenDynamic, adLockOptimistic

' ...
' другой код
' ...

' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
' теперь все ОК
' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Do Until l_objRecordSetSecond.EOF
       l_objRecordSetSecond.Fields("state").Value = - 1 
       l_objRecordSetSecond.Update
       If (Err <>  0 ) Then
              l_objLog.m_WriteLine "Ошибка. е удалось модифицировать запись в журнале. " & Err.Description
              l_flagWasError = True
              Err.Clear
              End If
              l_objRecordSetSecond.MoveNext
Loop


Человеки, поможите, что это может быть, ведь ничего не изменилось по сути.
...
Рейтинг: 0 / 0
Модификация полей ADODB.Recordset
    #33583754
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
почему бы не использовать запрос с выборкой Update в SQL
и не мучить рекордсет
попробуй убери Update и прогони еще раз
или попррбуй использовать save вместо Update-а
хотя вряд ли получиться в рекорсете сформированном чере выборку изменит запись
...
Рейтинг: 0 / 0
Модификация полей ADODB.Recordset
    #33584097
ВasiС
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй так:

Код: plaintext
1.
2.
3.
4.
5.
6.
' выборка
l_objDBCConnection.Execute "UPDATE " & ConnectionParam.strTJL & " SET state=FALSE WHERE tableid=" & l_TableID & _
                                      " .AND. dbid=" & l_DBID & _
                                      " .AND. recid=" & l_RECID & _
                                      " .AND. act<>'P'" & _
                                      " .AND. state>=0" & _
                                      " .AND. owncenterid<>" & l_DBIDinPackage
И быстрее и красивше =))
...
Рейтинг: 0 / 0
Модификация полей ADODB.Recordset
    #33584644
pr0teus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВasiСИ быстрее и красивше =))

Вопрос в общем-то заключался в том, что у меня непроходили изменения почему-то в первом случае, а во втором варианте кода прошли, хотя я добавил только centerid. Таким образом мне просто не понятно из-за чего была ошибка.

А по поводу быстроты, ну не знаю. Что Execute с Update запрсом выполнется быстрее нежели мой цикл, хотя может быть. Только вот выборка у меня почти всегда равна очень малому числу записей от 1 до 10.
...
Рейтинг: 0 / 0
Модификация полей ADODB.Recordset
    #33584743
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pr0teus ВasiСИ быстрее и красивше =))

Вопрос в общем-то заключался в том, что у меня непроходили изменения почему-то в первом случае, а во втором варианте кода прошли, хотя я добавил только centerid. Таким образом мне просто не понятно из-за чего была ошибка.

А по поводу быстроты, ну не знаю. Что Execute с Update запрсом выполнется быстрее нежели мой цикл, хотя может быть. Только вот выборка у меня почти всегда равна очень малому числу записей от 1 до 10.

решайся, решайся на Update)))))))))))
скорость и без ошибок
конечно код у тебя красивее, но не эффективнее
...
Рейтинг: 0 / 0
Модификация полей ADODB.Recordset
    #33585246
ВasiС
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как показывает моя практика работа с Access, крайне нежелательно использовать имена полей схожие с названиями таблиц или с названиями других полей, например
owncenterid похоже на centerid
возможно, название таблицы у тебя: centerider

Может грабли там, а может и нет. Попробуй поменять названия полей, чтобы они были более различимы. Например таблица Centers, поле
CenterOwn и CenterId. Если нет, то только полный код поможет увидеть причину. (хотя я не знаю, будет ли у кого желание разбираться)
...
Рейтинг: 0 / 0
Модификация полей ADODB.Recordset
    #33585505
pr0teus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем. Попробую повторить сей эффект у себя и поискать эти грабли 8) А то это не дело, когда прога зацыкливается по неизвестным причинам.
...
Рейтинг: 0 / 0
Модификация полей ADODB.Recordset
    #33585812
pr0teus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот и грабли Query-based update failed because the row to update could not be found.

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

l_objRecordSetSecond.Fields("state").Value = -1
l_objRecordSetSecond.Update

вызовет ошибку, т.к. предыдущая еще выполняется, и как следствие получается зацыкливание при данном коде

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Do Until l_objRecordSetSecond.EOF
     l_objRecordSetSecond.Fields("state").Value = - 1 
     l_objRecordSetSecond.Update
     If (Err <>  0 ) Then
          l_objLog.m_WriteLine "Ошибка. Не удалось модифицировать запись. " & Err.Description
          l_flagWasError = True
          Err.Clear
     End If
     l_objRecordSetSecond.MoveNext
Loop
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Модификация полей ADODB.Recordset
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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