ADODB.Recordset不会在MySQL数据库中获取最后插入的ID

时间:2014-02-22 17:04:03

标签: mysql ms-access vbscript asp-classic recordset

此功能适用于MDB Access数据库

Function InsertRecord(dbConnectionString, tableName, primaryKeyName, fieldNames, fieldValues)
    Dim cn,rs,ID
    Set cn = Server.CreateObject("ADODB.Connection")
    Set rs = Server.CreateObject("ADODB.Recordset") 
    cn.Open dbConnectionString
    cn.BeginTrans
    rs.Open tableName, cn, 1, 3, 2 'adOpenKeyset, adLockOptimistic, adCmdTable  
    rs.AddNew fieldNames, fieldValues
    rs.Update
    rs.MoveLast
    ID = rs.Fields(primaryKeyName).Value 'in MySQL it's not returning the last AUTOINCREMENT PrimaryKey ID
    rs.Close
    Set rs = Nothing
    cn.CommitTrans
    cn.Close
    Set cn = Nothing
    If Err.Number = 0 Then
        InsertRecord = ID
    Else
        InsertRecord = Nothing
    End If
End Function

当我执行以下代码时,我可以在* .MDB数据库的表中获取最后插入的主键(自动增量)ID

Dim ThisRecordID, arr1, arr2
arr1 = Array("mynumber", "mytext")
arr2 = Array("123456789", "max")            
ThisRecordID = InsertRecord("{connection string}", "myTable", "ID", arr1, arr2) 
Response.Write("Last record ID: " & ThisRecordID & "<br>")

假设该表名为&#34; myTable&#34;以及以下字段&#34; ID&#34; (INT自动增量),&#34; mynumber&#34; (文字),&#34; mytext&#34; (文本)。

如果我在MySQL数据库中运行具有相同字段的表的代码,&#34; ThisRecordID&#34; value不等于存储在最后一条记录中的ID值。

3 个答案:

答案 0 :(得分:0)

你不能使用

Dim sql
If dbConnectionString = " [ your JET connection string ]" then
sql = "select top 1 ID from MyTable order by ID desc"
elseif dbConnectionString = " [ your MySQL connection string ]" then
sql = "select ID from MyTable order by ID desc limit 0,1"
end if
rs.open sql
response.write rs("ID")
rs.close

答案 1 :(得分:0)

我重写了这个函数:

Function InsertRecord(dbConnectionString, tableName, primaryKeyName, fieldNames, fieldValues)
    Dim cn,rs,ID
    Set cn = Server.CreateObject("ADODB.Connection")
    Set rs = Server.CreateObject("ADODB.Recordset") 
    cn.Open dbConnectionString
    cn.BeginTrans
    rs.Open tableName, cn, 1, 3, 2 'adOpenKeyset, adLockOptimistic, adCmdTable  
    rs.AddNew fieldNames, fieldValues
    rs.Update
'   Fixed Bug:
'   reading from a MySQL database, the following code is not returning the last AUTOINCREMENT PrimaryKey ID
'       rs.MoveLast
'       ID = rs.Fields(primaryKeyName).Value
    rs.Close
    Dim sql : sql = "SELECT * FROM " & tableName & " ORDER BY " & primaryKeyName & " DESC"
    Set rs = cn.Execute(sql)
    ID = rs.Fields(primaryKeyName).Value
    rs.Close
    Set rs = Nothing
    cn.CommitTrans
    cn.Close
    Set cn = Nothing
    If Err.Number = 0 Then
        InsertRecord = ID
    Else
        InsertRecord = Nothing
    End If
End Function

答案 2 :(得分:0)

从原始帖子中,您需要做的就是设置记录集光标位置。

Function InsertRecord(dbConnectionString, tableName, primaryKeyName, fieldNames, fieldValues)
   Dim cn,rs,ID
   Set cn = Server.CreateObject("ADODB.Connection")
   Set rs = Server.CreateObject("ADODB.Recordset") 
   rs.cursorLocation = 3
   cn.Open dbConnectionString
   cn.BeginTrans
   rs.Open tableName, cn, 1, 3, 2 'adOpenKeyset, adLockOptimistic, adCmdTable  
   rs.AddNew fieldNames, fieldValues
   rs.Update
   rs.MoveLast
   ID = rs.Fields(primaryKeyName).Value 
   rs.Close
   Set rs = Nothing
   cn.CommitTrans
   cn.Close
   Set cn = Nothing
   If Err.Number = 0 Then
       InsertRecord = ID
   Else
       set InsertRecord = Nothing
   End If
End Function