使用 ADO 从 MS 访问 Excel 检索最后插入的最大记录

Retrieving Last Inserted Max Record From MS access to Excel Using ADO

嗨,梅想知道为什么 Copyfromrecordset 不起作用 有没有解决使用 ADO 的问题?

我只有一个 Table One Number COlumn,它不接受重复项。 还需要检索 ID 号,以便其他代码用于多用户目的。

Sub PostData()
Dim cnn As ADODB.Connection 'dim the ADO collection class
Dim rst As ADODB.Recordset 'dim the ADO recordset classe here
Dim dbPath
Dim x As Long, i As Long

'add error handling
On Error GoTo errHandler:

dbPath = Sheets("Sheet3").Range("h1").Value

Set cnn = New ADODB.Connection

cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath

Set rst = New ADODB.Recordset 'assign memory to the recordset
Sql = "INSERT INTO DvID(DVnumber)SELECT Max(DVNumber)+1 FROM DvID "
rst.Open Sql, cnn
Sheet3.Range("A2").CopyFromRecordset rst
rst.Close
cnn.Close

Set rst = Nothing
Set cnn = Nothing

On Error GoTo 0
Exit Sub
errHandler:

Set rst = Nothing
Set cnn = Nothing

MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure Export_Data"
End Sub

请参阅 Remarks

中的这段

使用 Open 方法的 Source 参数执行没有 return 记录的操作查询不是一个好主意,因为没有简单的方法来确定调用是否成功。由此类查询编辑的记录集 return 将被关闭。要执行不 return 记录的查询,例如 SQL INSERT 语句,请改为调用 Command 对象的 Execute 方法或 Connection 对象的 Execute 方法。

如果您使用单独的 select 并插入查询,则存在另一个用户可能在两者之间创建记录的风险。首选使用自动增量键。有了这个警告尝试

Sub PostData()

    Dim cnn As ADODB.Connection 'dim the ADO collection class
    Dim rst As ADODB.Recordset 'dim the ADO recordset classe here
    Dim dbPath As String, sql As String
    Dim newID As Long

    'add error handling
    On Error GoTo errHandler:

    dbPath = Sheets("Sheet3").Range("h1").Value

    Set cnn = New ADODB.Connection

    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath
    Set rst = New ADODB.Recordset 'assign memory to the recordset

    rst.Open "SELECT MAX(DVNumber)+1 FROM DvID", cnn
    newID = rst(0)
    cnn.Execute "INSERT INTO DvID(DVnumber) VALUES (" & newID & ")"

    Sheet3.Range("A2") = newID

    rst.Close
    cnn.Close
    Set rst = Nothing
    Set cnn = Nothing

    MsgBox newID & " Inserted", vbInformation

    On Error GoTo 0
    Exit Sub
errHandler:

    Set rst = Nothing
    Set cnn = Nothing

    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure PostData"

End Sub