在ADODB.Recordset.AddNew关闭对象时,不允许Excel VBA错误3704操作

时间:2013-12-18 18:47:43

标签: excel sql-server-2008 vba excel-vba

请原谅这些草率的编码,但我被投入到一个项目中,以便将电子表格中的数据提供给SQL服务器,并且错过了截止日期。我能够使用SELECT语句初始获取我的第一个数据擦除,但我似乎无法将其切换到更新。

这是代码。当对象在第一个Recordset.AddNew行关闭时,我不允许运行时错误3704操作

Public cnnConn As ADODB.Connection
Public rstRecordset As ADODB.Recordset
Public cmdCommand As ADODB.Command
Public Const Server As String = "datguy"
Public SQLQuery As String
Option Explicit

Sub testupinsertupdate()

Dim wkb As Workbook
Dim wks As Worksheet
Dim sel As Range
Set wkb = ActiveWorkbook
Set wks = Sheets(1)
Set sel = Selection

With wks

'Declaration unit

Dim dataitem As String
Dim yr As Integer
Dim yrmax As Integer
Dim rxcount As Integer
Dim row As Integer
Dim col As String
Dim cleanup As String
Dim sqlrxcount As String

dataitem = .Range("B3").Value
yr = 6 'data only needs to go back to 2006
yrmax = .Range("C7").End(xlToRight).row + yr 'declarative count to the Right-Of-File
rxcount = 7
row = .Range("A" & .Rows.Count).End(xlUp).row 'declarative count to EOF
col = .Range("C6").End(xlToRight).Column
cleanup = "Data Unavailable"
sqlrxcount = .Range("A" & rxcount).Value

Set cnnConn = New ADODB.Connection
cnnConn.ConnectionString = "driver={SQL Server};server=" & Server & ";database=database;Trusted_Connection=Yes"
cnnConn.ConnectionTimeout = 800
cnnConn.Open

For rxcount = 7 To row
    Set cmdCommand = New ADODB.Command
    Set cmdCommand.ActiveConnection = cnnConn
        With cmdCommand
            .CommandTimeout = 0
            .CommandText = "UPDATE table SET " & dataitem & " = '" & Cells(col).Value & "' WHERE RX_ID = '" & sqlrxcount & "'"
            .CommandType = adCmdText
            .Execute
            Debug.Print cmdCommand.State
        End With
        Debug.Print cmdCommand.State
    Set rstRecordset = New ADODB.Recordset
    Set rstRecordset.ActiveConnection = cnnConn
    rstRecordset.Open cmdCommand, , adOpenStatic, adLockBatchOptimistic
    col = ("C" & rxcount)
     For yr = 6 To yrmax

        rstRecordset.AddNew '*** error pops!
        rstRecordset.Fields("RX_ID") = Range("A" & rxcount).Value
        rstRecordset.Fields("YEAR_REPORTED") = yr + 2000
        If Range(col).Value = cleanup Then
            rstRecordset.Fields(dataitem) = Null
        Else: rstRecordset.Fields(dataitem) = Range(col).Value
        End If

        'debug line to show results
        Debug.Print Range("A" & rxcount).Value, yr + 2000, Range(col).Value
        col = Range(col).Offset(0, 1).Address

    Next yr

Next rxcount

rstRecordset.UpdateBatch
rstRecordset.Close

cnnConn.Close


End With

End Sub

我觉得我没有按顺序进行操作,但我只是想尝试初始加载,然后再担心维护。为什么对象(我假设这是记录集)在打开之前打开了三行?

1 个答案:

答案 0 :(得分:1)

您正在尝试根据更新而不是选择打开记录集   rstRecordset.Open cmdCommand,adOpenStatic,adLockBatchOptimistic 应该是这样的   rstRecordset.Open" select * from table",cnnconn,adOpenStatic,adLockBatchOptimistic