Ошибка выполнения 3704

#vb6 #adodb

Вопрос:

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

У меня есть поисковый поток stackoverflow для аналогичной проблемы, но я думаю, что что-то упускаю. Мне нужно обновить каждую строку в 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=\host1softwareMILcompany0"
cn1.Open

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



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

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

Ответ №1:

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

Комментарии:

1. спасибо за ваш ответ, Арво.Но когда я не ставлю код do while. Обновляется только одна запись. Мне нужно обновить каждую строку в rs2 с rs1.Не могли бы вы посоветовать мне, пожалуйста

2. Почему вы используете функцию открытия набора записей для обновлений? Почему ты зацикливаешься на rs2? Сколько записей в rs1, какая из них отвечает вашим интересам? Почему вы не можете использовать операции на основе наборов для обновления? Мне кажется, что логика вашей программы тоже не очень ясна.

3. У поставщика VFP есть некоторые странные ограничения. ВЫБОР В и ВСТАВКА В, вероятно, не работают, даже если предположить, что вы могли бы использовать связанную таблицу и т. Д.

Ответ №2:

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

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

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

Комментарии:

1. Возможно, было бы лучше избавиться от rs2 и использовать cn1.Вместо этого выполните, это не то, для чего нужен набор записей. Избавьтесь от двойного отрицания «Делай, пока не EOF» и вместо этого используйте «Делай, пока EOF». Не проверяйте EOF во второй раз внутри цикла, это бессмысленно. Вы уверены, что хотите ОБНОВИТЬ, а не ВСТАВЛЯТЬ сюда?

2. @Bob Riemersma Я согласен с вами, и в этом коде все еще есть сто ошибок, которые можно (или нужно) улучшить. Я стараюсь помочь пользователю, внося минимальные изменения в его код. Тем временем я настоятельно рекомендую вам написать свой собственный ответ.

3. Арво,@Bob Riemersma . Большое вам спасибо за вашу помощь. Да, мне нужно обновить таблицу vfp. Я создал связанный сервер в sql, но не смог его обновить. Поэтому я вызываю rs1 из sql, а затем обновляю vfp в vb6. Я был бы признателен, если бы вы могли подсказать мне лучшее решение для реализации. Еще раз спасибо за потраченное время.

Ответ №3:

Вам не нужно создавать набор записей, чтобы выполнить обновление, вставку или удаление в базе данных. Просто используйте инструкцию 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: " amp; Format(nRecords,"0")
 

Ответ №4:

попробуйте открыть 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