【问题标题】:Runtime error 3704运行时错误 3704
【发布时间】:2011-05-30 06:03:30
【问题描述】:

在我的 vb6 中,当对象关闭时,我收到错误 3704 operation is not allowed.

我在 stackoverflow 上搜索过类似的问题,但我认为我遗漏了一些东西。我需要根据记录集 rs1 更新 vfp 中的每一行 这是我的代码:

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

【问题讨论】:

    标签: vb6 adodb


    【解决方案1】:

    更新查询不返回记录集,因此您的 rs2 未打开。

    【讨论】:

    • 感谢您对 Arvo 的回复。但是当我没有放置 do while 代码时。只有一条记录被更新。我需要从 rs1 更新 rs2 中的每一行。请您给我建议跨度>
    • 为什么要使用记录集打开功能进行更新?为什么你在 rs2 上循环? rs1 中有多少条记录,哪一条符合您的兴趣?为什么不能使用基于集合的操作进行更新?我觉得你的程序逻辑也不是很清楚。
    • VFP 提供程序有一些时髦的限制。 SELECT INTO 和 INSERT INTO 可能不起作用,即使假设您可以使用链接表等。
    【解决方案2】:

    您在错误的记录集上执行循环:我在您的代码中用 rs1 替换了一些 rs2。

    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
    

    【讨论】:

    • 摆脱 rs2 并改用 cn1.Execute 可能会更好,这不是 Recordset 的用途。摆脱“Do While Not EOF”双重否定并改用“Do until EOF”。不要在循环内第二次检查 EOF,这是没有意义的。您确定要更新而不是在此处插入吗?
    • @Bob Riemersma 我同意你的观点,这段代码仍有一百个问题可以(或应该)改进。我试图通过对他的代码做最少的修改来帮助用户。同时,我强烈建议你自己写答案。
    • Arvo,@Bob Riemersma 。非常感谢您的帮助。是的,我需要更新一个 vfp 表。我在 sql 中创建了一个链接服务器,但我无法更新它。所以我打电话给 rs1从 sql 然后更新 vb6 中的 vfp。如果您能指导我实施最佳解决方案,我将不胜感激。再次感谢您的时间。
    【解决方案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: " & Format(nRecords,"0")
    

    【讨论】:

      【解决方案4】:

      在 do while 语句中使用 if 之前尝试打开你的 rs2,或者这样做

      rs2.open " blah blah blah "
      
      Do Until rs2.eof
          For Each fld In rs2.field 
              value_holder = fld.value
          Next
      
          rs2.movenext
      Loop
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-25
        • 1970-01-01
        • 2016-02-29
        • 1970-01-01
        • 1970-01-01
        • 2019-02-18
        • 1970-01-01
        相关资源
        最近更新 更多