Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Какой то глюк из-за Update / 14 сообщений из 14, страница 1 из 1
08.10.2008, 19:02
    #35584102
PavelT100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
VB6. Работаю с MS SQL SERVER 2005.
В цикле пишу следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
...
        Dim StrSQL As String
        ..... 
        Dim rs As New ADODB.Recordset
        Call rs.Open(StrSQL, cnnPBD, adOpenKeyset, adLockOptimistic, adCmdText)
        
        Dim flA As Boolean, flM As Boolean: flM = False: flA = False
        If rs.EOF Then
                 rs.AddNew
                 flA = True
                 ....... 
         Else
                   .......
' при каких-то условиях иногда выставляю flM
         End If
         If flA Or flM Then
                   rs!modif = tm
          End If
        rs.Update
        rs.Close
и это все как-то работает. Но если rs.Update только когда это действительно нужно :
Код: plaintext
1.
2.
3.
4.
5.
         If flA Or flM Then
                   rs!modif = tm
                   rs.Update
          End If
        rs.Close
то на второй итерации цикла вырабатывается ошибка на вызове функции:
Call rs.Open(StrSQL, cnnPBD, adOpenKeyset, adLockOptimistic, adCmdText)
ошибка такая:
Source : ADODB.Recordset
Description: Operation is not allowed when the object is open.
Что здесь не так ?
...
Рейтинг: 0 / 0
08.10.2008, 23:15
    #35584375
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
Уберите Call. Почитайте хотя бы это . И обратите внимание на то, что при модификации связанного рекордсета апдейт вызывается автоматом...
...
Рейтинг: 0 / 0
09.10.2008, 12:17
    #35585220
PavelT100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
Внимательно прочитал, но ничего нового и полезного для себя не нашел. Там в частности написано:
Если курсор перемещён с добавленной или изменённой записи, метод вызывается автоматически.

но я не перемещаю курсор посредством MoveNext или другим подобным образом. Каждый раз я делаю rs.Open, работаю с одной записью, а потом делаю опять rs.Open.

При более тщательном тестировании оказалось, что если не делать rs.Update, то на rs.Close вырабатывается ошибка:
Код: plaintext
1.
2.
Error Number: C93
 Source     : ADODB.Recordset
 Description: Operation is not allowed in this context.

Мне в данном конкретном случае не жалко делать всегда rs.Update, но хотелось бы понять почему я должен это делать даже тогда когда фактически поля записи не модифицирую ?
Убрав call вообще не увидел никаких изменений, ну стало у меня теперь
Код: plaintext
rs.Open StrSQL, cnnPBD, adOpenKeyset, adLockOptimistic, adCmdText
, но это чисто синтаксические модификации ни на что влиять не должны.
...
Рейтинг: 0 / 0
09.10.2008, 23:13
    #35586874
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
Вы говорите, что внимательно прочитали?

Если у вас курсор Keyset, то модификация таблицы вызывается через .UpdateBatch()
...
Рейтинг: 0 / 0
15.10.2008, 14:21
    #35595825
PavelT100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
AndreTMВы говорите, что внимательно прочитали?

Если у вас курсор Keyset, то модификация таблицы вызывается через .UpdateBatch()

В том варианте когда происходит ошибка вообще Update не выполняется. Просто делается rs.close и на следующей второй итерации при вызове
Call rs.Open(StrSQL, cnnPBD, adOpenKeyset, adLockOptimistic, adCmdText)
происходит ошибка.
...
Рейтинг: 0 / 0
15.10.2008, 15:53
    #35596167
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
если уж делаете
rs.AddNew
то делайте либо rs.Update , либо rs.CancelUpdate

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
15.10.2008, 16:09
    #35596225
PavelT100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
HandKotесли уж делаете
rs.AddNew
то делайте либо rs.Update , либо rs.CancelUpdate

А если не выполняется ни rs.AddNew ни rs.Update а только Open и Close - что делать ? Именно в этом случае на второй итерации ошибка.
...
Рейтинг: 0 / 0
15.10.2008, 16:20
    #35596262
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
выложите наконец сюда свой код с жутким циклом, а мы посмотрим.
...
Рейтинг: 0 / 0
15.10.2008, 18:47
    #35596717
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
Я бы для начала убрал декларации из тела цикла...
...
Рейтинг: 0 / 0
16.10.2008, 08:15
    #35597256
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
PavelT100HandKotесли уж делаете
rs.AddNew
то делайте либо rs.Update , либо rs.CancelUpdate

А если не выполняется ни rs.AddNew ни rs.Update а только Open и Close - что делать ? Именно в этом случае на второй итерации ошибка.


если бы ничего этого не было, тогда бы и ошибки не было

выложите весь цикл целиком, а не обрезки

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
12.11.2008, 13:27
    #35649054
PavelT100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
Спасибо всем! Проблему с которой обращался я решил. Все дело было очень просто, я по невнимательности не заметил, что запись модифицируется

Код: plaintext
 12150         rs!Checked =  1 
и тогда если не вызывать rs.Update происходит рассматриваемая ошибка. Все здесь понятно. Но основная проблема, из-за которой я начал отлаживать существующий код в другом – вот запускаю я приложенный код. Чаще всего все работает. И процедура MAJ_TABLE1 дорабатывается до конца, запускаю ее еще и еще на тех же самых исходных данных. Так вот один раз из 10-15 все падает. Падает каждый раз на разных записях. Вот прилагаю исходный код и логи которые получаются. Сейчас у меня нет никой осмысленной теории, почему так происходит и нет даже плана для исследований.

Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
Sub MAJ_TABLE1(table As String, cnnMDQ As ADODB.Connection, tm As Date, Optional sufiks As String = "")
 11770     Call ToLog("Begin MAJ_TABLE " & table & " Count " & GetCount(table))
 11780     Call cnnPBD.Execute("Update " & table & " SET checked=0")
    
    Dim i As Long: i =  0 
    Dim cA As Long, cM As Long, cD As Long: cA =  0 : cM =  0 : cD =  0 
    Dim j As Integer
    Dim FieldKey1 As String, FieldKey2 As String, FieldKey3 As String, FieldKey4 As String
    Dim StrSQL As String, sMod As String
        
    Dim rm As New ADODB.Recordset
    Dim rs As New ADODB.Recordset
    
    Dim st As String: st = table: If st = "icd10" Then st = "icd-10"
 11790     Call rm.Open(st + sufiks, cnnMDQ, adOpenStatic, adLockReadOnly, adCmdTableDirect)
    
 11800     Do While Not rm.EOF
 11810         StrSQL = CreateStrSQL(table, rm, FieldKey1, FieldKey2, FieldKey3, FieldKey4)
 11820         On Error GoTo ErrorH
        
 11830         Set rs = Nothing
 11840         Call rs.Open(StrSQL, cnnPBD, adOpenKeyset, adLockOptimistic, adCmdText)
        
        Dim flA As Boolean, flM As Boolean: flM = False: flA = False
 11850         If rs.EOF Then
 11860             rs.AddNew
 11870             For j =  0  To rm.Fields.count -  1 : rs.Fields(j) = rm.Fields(j): Next j
 11880             cA = cA +  1 
 11890             Call ToLog("Add " & table & " " & FieldKey1 & " " & FieldKey2 & " " & FieldKey3 & " " & FieldKey4)
 11900                  flA = True
 11910         Else
 11920             For j =  0  To rm.Fields.count -  1 
 11930                 If EqualType(rm.Fields(j).Type, rs.Fields(j).Type) Then
 11940                     If rm.Fields(j).Type <> adLongVarBinary And rm.Fields(j).Type <> adLongVarChar Then
 11950                         If rm.Fields(j).value <> rs.Fields(j).value Then
 11960                                 Call ToLog("Step 1")
 11970                         End If
 11980                     Else
 11990                         If Not (IsNull(rm.Fields(j).value) And IsNull(rs.Fields(j).value)) Then
 12000                             If IsNull(rs.Fields(j).value) And Not IsNull(rm.Fields(j).value) Then
 12010                                         Call ToLog("Step 2")
 12020                             ElseIf Not IsNull(rm.Fields(j).value) And Not IsNull(rs.Fields(j).value) Then
 12030                                 If CStr(rm.Fields(j).value) <> CStr(rs.Fields(j).value) Then
 12040                                         Call ToLog("Step 3")
 12050                                 End If
 12060                             ElseIf Not IsNull(rs.Fields(j).value) And IsNull(rm.Fields(j).value) Then
 12070                                         Call ToLog("Step 4")
 12080                             End If
 12090                         End If
 12100                     End If
 12110                 End If
 12120             Next j
 12130             If flM Then cM = cM +  1 
 12140         End If
 12150         rs!Checked =  1 
 12160         If flA Or flM Then
 12170                    rs!modif = tm
 12180         End If
 12190         rs.Update
 12200         rs.Close
 12210         Set rs = Nothing
    
ErrorH:
 12220         Call CommonError
 12230         If cnnPBD.Errors.count >  0  Then
 12240             Call ToLog("cnnPBD.Errors: " & table & " " & CStr(i) & " ERROR1 " & FieldKey1 & " " & FieldKey2 & " " & FieldKey3 & " " & FieldKey4)
 12250             Call ToLog("Error at line " & Erl)
            Dim er As ADODB.Error
 12260             For Each er In cnnPBD.Errors
 12270                 Call ToLog("cnnPBD - Number    : " & Hex(er.Number) & vbCrLf & _
                           "Source    : " & er.Source & vbCrLf & _
                           "Desription: " & er.Description)
 12280             Next
 12290         End If

 12300         rm.MoveNext
 12310         i = i +  1 
 12320     Loop
 12330     rm.Close
    
 12340     cD = DeleteFromTable(table, tm)
    
 12350     Call ToLog("Add in " & table & ": " & CStr(cA))
 12360     Call ToLog("Mod in " & table & ": " & CStr(cM))
 12370     Call ToLog("Del in " & table & ": " & CStr(cD))
 12380     Call ToLog("Count " & GetCount(table))
    
 12390     Set rm = Nothing
 12400     Set rs = Nothing
End Sub

Function EqualType(T1 As Integer, T2 As Integer) As Boolean
 9390     EqualType = True
 9400     If T1 = T2 Then Exit Function
 9410     If (T1 = adChar Or T1 = adVarChar) And (T2 = adChar Or T2 = adVarChar) Then Exit Function
 9420     If T1 = adDBDate And T2 = adDBTimeStamp Then Exit Function
 9430     EqualType = False
End Function

Sub CommonError()
 15950          If Erl =  0  Then Exit Sub
 15960          Call ToLog("CommonError: ")
 15970     Call ToLog("Error at line " & Erl)
 15980     Call ToLog("Error Number: " & Hex(Err.Number) & vbCrLf & _
               " Source     : " & Err.Source & vbCrLf & _
               " Description: " & Err.Description)
    
    Dim er As ADODB.Error
 15990     If cnnPBD.Errors.count >  0  Then
 16000     Call ToLog("Error in cnnPBD")
 16010                 For Each er In cnnPBD.Errors
 16020                     ToLog ("Number    : " & Hex(er.Number) & vbCrLf & _
                           "Source    : " & er.Source & vbCrLf & _
                           "Desription: " & er.Description)
 16030                 Next
 16040                 Call ToLog("cnnPBD.CommandTimeout = " & cnnPBD.CommandTimeout)
 16050     End If
 16060     If cnnPBD2.Errors.count >  0  Then
 16070     Call ToLog("Error in cnnPBD2")
 16080                 For Each er In cnnPBD2.Errors
 16090                     ToLog ("Number    : " & Hex(er.Number) & vbCrLf & _
                           "Source    : " & er.Source & vbCrLf & _
                           "Desription: " & er.Description)
 16100                 Next
 16110                 Call ToLog("cnnPBD2.CommandTimeout = " & cnnPBD2.CommandTimeout)
 16120     End If
End Sub

На самом деле в сравниваемых таблицах все записи одинаковые и никаких модификаций быть не должно. Вот такой получается лог, когда процедура работает хорошо.
Код: plaintext
1.
2.
3.
4.
5.
12:44:50 Begin MAJ_TABLE chimie Count 3461
12:45:06 Delete from  chimie 0 records
12:45:06 Add in chimie: 0
12:45:06 Mod in chimie: 0
12:45:06 Del in chimie: 0
12:45:06 Count 3461

А вот так когда падает :

Код: 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.
12:45:35 Begin MAJ_TABLE chimie Count 3461
12:45:38 CommonError: 
12:45:38 Error at line 12190
12:45:38 Error Number: 80004005
 Source     : Microsoft OLE DB Provider for SQL Server
 Description: There are no rows in the current fetch buffer.
12:45:38 Error in cnnPBD
12:45:38 Number    : 80004005
Source    : Microsoft OLE DB Provider for SQL Server
Desription: There are no rows in the current fetch buffer.
12:45:38 Number    : 80004005
Source    : Microsoft OLE DB Provider for SQL Server
Desription: The statement has been terminated.
12:45:38 Number    : 80040E21
Source    : Microsoft OLE DB Provider for SQL Server
Desription: Une opération OLE-DB en plusieurs étapes a généré des erreurs. Vérifiez chaque valeur d'état OLE-DB disponible. Aucun travail n'a été effectué.
12:45:38 cnnPBD.CommandTimeout = 0
12:45:38 cnnPBD.Errors: chimie 964 ERROR1 CEFON010   
12:45:38 Error at line 12190
12:45:38 cnnPBD - Number    : 80004005
Source    : Microsoft OLE DB Provider for SQL Server
Desription: There are no rows in the current fetch buffer.
12:45:38 cnnPBD - Number    : 80004005
Source    : Microsoft OLE DB Provider for SQL Server
Desription: The statement has been terminated.
12:45:38 cnnPBD - Number    : 80040E21
Source    : Microsoft OLE DB Provider for SQL Server
Desription: Une opération OLE-DB en plusieurs étapes a généré des erreurs. Vérifiez chaque valeur d'état OLE-DB disponible. Aucun travail n'a été effectué
.
...
Рейтинг: 0 / 0
12.11.2008, 19:12
    #35650226
PavelT100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
Провел еще несколько экспериментов, последовательно убираю куски кода и фиксирую факт ошибки.
Итак, если убрать код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 12000                             If IsNull(rs.Fields(j).value) And Not IsNull(rm.Fields(j).value) Then
 12010                                         Call ToLog("Step 2")
 12020                             ElseIf Not IsNull(rm.Fields(j).value) And Not IsNull(rs.Fields(j).value) Then
 12030                                 If CStr(rm.Fields(j).value) <> CStr(rs.Fields(j).value) Then
 12040                                         Call ToLog("Step 3")
 12050                                 End If
 12060                             ElseIf Not IsNull(rs.Fields(j).value) And IsNull(rm.Fields(j).value) Then
 12070                                         Call ToLog("Step 4")
 12080                             End If
То ошибка возникает с некоторой вероятностью. А вот если убрать еще и условие
Код: plaintext
1.
2.
 11990                         If Not (IsNull(rm.Fields(j).value) And IsNull(rs.Fields(j).value)) Then
 12090                         End If
То ошибка не наблюдалась на 150 экспериментах подряд. В обычном режиме падает раз 15. Что делать с этими новыми знаниями и как их применить на практике, увы, пока не знаю.
...
Рейтинг: 0 / 0
13.11.2008, 08:31
    #35650661
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
а еще кто-нибудь с этими таблицами работает?

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
13.11.2008, 10:30
    #35650925
PavelT100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой то глюк из-за Update
HandKotа еще кто-нибудь с этими таблицами работает?

I Have Nine Lives You Have One Only
THINK!
Нет, с этими таблицами никто не работает, это отдельный проект синхронизации.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Какой то глюк из-за Update / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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