#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