Ошибка выполнения 3704 - PullRequest
0 голосов
/ 30 мая 2011

В моем vb6 я получаю сообщение об ошибке 3704 Операция не разрешена, когда объект закрыт.

У меня есть стековый поток поиска для аналогичной проблемы, но я думаю, что что-то упустил. Мне нужно обновить каждую строку в VFP на основе набора записей rs1 Вот мой код:

Option Explicit
Dim cn As New ADODB.Connection
Dim cn1 As New ADODB.Connection

Private Sub trns_Click()
Set cn = New ADODB.Connection
Set cn1 = New ADODB.Connection

cn.ConnectionString = MDI1.txtcn.Text
cn.Open


cn1.ConnectionString = "Provider=VFPOLEDB;Data Source=\\host1\software\MIL\company0"
cn1.Open

rs1.Open "Select * from trans", cn, adOpenStatic, adLockPessimistic



Do While Not rs2.EOF
    rs2.Open "update transac set no_ot_1_5 = " & rs1.Fields("ovt1") & ", no_ot_2_0 = " & rs1.Fields("ovt2") & ", no_ot_3_0" _
             & "= " & rs1.Fields("ovt3") & ",Meal_allw = " & rs1.Fields("meal_allow") & ",on_duty = " & rs1.Fields("cnt") & ",no_d_local = " & rs1.Fields("local") & ",no_d_sick" _
             & "= " & rs1.Fields("sick") & ",no_d_abs = " & rs1.Fields("absence") & ",no_d_spc = " & rs1.Fields("special") & ",Revenue02" _
             & "= " & rs1.Fields("refund") & ",Revenue05 = " & rs1.Fields("prepay") & ",Deduct05 = " & rs1.Fields("prepay") & ",Revenue01 = " & rs1.Fields("comm") & "where code = '" & rs1.Fields("emp_code") & "' and transac.date = CTOD('" & trans.txtend2 & "')", cn1, adOpenDynamic, adLockPessimistic

    If Not rs2.EOF Then
      rs2.MoveNext
    End If
Loop
rs2.close

Ответы [ 4 ]

0 голосов
/ 23 июня 2011

попробуйте открыть ваш rs2 перед использованием if в операторе do while., Или сделайте это так

rs2.open " blah blah blah "

Do Until rs2.eof
    For Each fld In rs2.field 
        value_holder = fld.value
    Next

    rs2.movenext
Loop
0 голосов
/ 30 мая 2011

Вы выполняете свой цикл с неправильным набором записей: я заменил некоторые из rs2 на rs1 в вашем коде.

Do While Not rs1.EOF
    rs2.Open "update transac set no_ot_1_5 = " & rs1.Fields("ovt1") & ", no_ot_2_0 = " & rs1.Fields("ovt2") & ", no_ot_3_0" _
             & "= " & rs1.Fields("ovt3") & ",Meal_allw = " & rs1.Fields("meal_allow") & ",on_duty = " & rs1.Fields("cnt") & ",no_d_local = " & rs1.Fields("local") & ",no_d_sick" _
             & "= " & rs1.Fields("sick") & ",no_d_abs = " & rs1.Fields("absence") & ",no_d_spc = " & rs1.Fields("special") & ",Revenue02" _
             & "= " & rs1.Fields("refund") & ",Revenue05 = " & rs1.Fields("prepay") & ",Deduct05 = " & rs1.Fields("prepay") & ",Revenue01 = " & rs1.Fields("comm") & "where code = '" & rs1.Fields("emp_code") & "' and transac.date = CTOD('" & trans.txtend2 & "')", cn1, adOpenDynamic, adLockPessimistic

    If Not rs1.EOF Then
      rs1.MoveNext
    End If
Loop
rs1.close
0 голосов
/ 06 июня 2011

Вам не нужно создавать набор записей для выполнения обновления, вставки или удаления в базе данных.Просто используйте оператор cn1.Execute YourSqlStatement, где YourSqlStatement - строка, которую вы передаете инструкции rs2.Open.Метод Execute в соединении дополнительно принимает переменную byRef, в которой можно получить количество затронутых записей.

Пример:

Dim nRecords As Integer    
cn1.Execute "Update Table Set Field = Value Where AnotherField = SomeValue ", nRecords
MsgBox "Total Updated Records: " & Format(nRecords,"0")
0 голосов
/ 30 мая 2011

Запрос на обновление не возвращает набор записей, следовательно, ваш rs2 не открыт.

...