加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql – 如何使用Excel VBA获取新插入记录的ID?

发布时间:2021-01-12 22:10:00 所属栏目:编程 来源:网络整理
导读:这好像是一个常见的题目,可是大大都办理方案都是指毗连多个SQL呼吁,我信托这是ADO / VBA无法做到的(但我很兴奋在这方面表现错误). 我当前插入我的新记录然后运行一个选择查询行使(我但愿)足够的字段,以担保只返回新插入的记录.我的数据库很少被一小我私人一次会见

这好像是一个常见的题目,可是大大都办理方案都是指毗连多个SQL呼吁,我信托这是ADO / VBA无法做到的(但我很兴奋在这方面表现错误).

我当前插入我的新记录然后运行一个选择查询行使(我但愿)足够的字段,以担保只返回新插入的记录.我的数据库很少被一小我私人一次会见(在查询之间产生另一次插入的风险可以忽略不计),而且因为表的布局,辨认新记录凡是很轻易.

我此刻正在实行更新一个没有太多独一性范畴的表,而不是人工主键.这意味着存在新记录也许不是独一的风险,而且我不肯意添加字段以逼迫独一性.

在这种环境下,将记录插入Access表然后从Excel查询新主键的最佳要领是什么?

感谢你的回覆.我试图让@@ IDENTITY事变,但这老是行使下面的代码返回0.

Private Sub getIdentityTest()
    Dim myRecordset As New ADODB.Recordset
    Dim SQL As String,SQL2 As String

    SQL = "INSERT INTO tblTasks (discipline,task,owner,unit,minutes) VALUES (""testDisc3-3"",""testTask"",""testOwner"",""testUnit"",1);"
    SQL2 = "SELECT @@identity AS NewID FROM tblTasks;"

    If databaseConnection Is Nothing Then
        createDBConnection
    End If

    With databaseConnection
        .Open dbConnectionString
        .Execute (SQL)
        .Close
    End With

    myRecordset.Open SQL2,dbConnectionString,adOpenStatic,adLockReadOnly

    Debug.Print myRecordset.Fields("NewID")

    myRecordset.Close

    Set myRecordset = Nothing
End Sub

有什么突出的责任吗?

可是,思量到Renaud辅佐提供的告诫(下图),行使@@ IDENTITY与行使任何其他要领的风险险些沟通,以是我此刻行使SELECT MAX.为了未来参考,固然我有乐趣看看我上面的实行有什么题目.

办理要领

关于你的题目:

I’m now trying to update a table that
does not have much scope for
uniqueness,other than in the
artificial primary key. This means
there is a risk that the new record
may not be unique,and I’m loathe to
add a field just to force uniqueness.

假如您行使AutoIncrement作为主键,那么您具有独一性,您可以行使SELECT @@ Identity;获取最后一个自动天生ID的值(请参阅下面的告诫).

假如您没有行使自动增量,而且您要从Access插入记录可是想从Excel中检索最后一个:

>确保您的主键是可排序的,因此您可以行使以下任一查询获取最后一个:

SELECT MAX(MyPrimaryField) FROM MyTable;
SELECT TOP 1 MyPrimaryField FROM MyTable ORDER BY MyPrimaryField DESC;

>可能,假如排序你的首要字段不会给你最后一个,你必要添加一个DateTime字段(好比InsertedDate)并在每次在该表中建设一个新记录时生涯当前日期和时刻,这样你就可以获得最后一个像这样:

SELECT TOP 1 MyPrimaryField FROM MyTable ORDER BY InsertedDate DESC;

在任何一种环境下,我以为您会发明添加AutoIncrement主键更轻易处理赏罚:

>这不会让你支付太多价钱
>这将担保您的记录的奇异性,而无需思量它
>这将使您更轻易选择最新的记录,行使@@ Identity或通过主键排序或获取Max().

来自Excel

要将数据导入Excel,您有以下几种选择:

>行使查询建设数据链接,以便直接在Cell或范畴中行使功效.
>来自VBA的查询:

Sub GetLastPrimaryKey(PrimaryField as string,Table as string) as variant
    Dim con As String
    Dim rs As ADODB.Recordset
    Dim sql As String
    con = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
          "Data Source= ; C:myDatabase.accdb"
    sql = "SELECT MAX([" & PrimaryField & "]) FROM [" & MyTable & "];"
    Set rs = New ADODB.Recordset
    rs.Open sql,con,adLockReadOnly
    GetLastPrimaryKey = rs.Fields(0).Value
    rs.Close
    Set rs = Nothing
End Sub

关于@@ Identity的留意事项

在尺度Access数据库(*)中行使@@ Identity时,您必需是careful of the caveats:

>它仅合用于AutoIncrement Identity字段.
>它仅在您行使ADO并运行SELECT @@ IDENTITY时才可用;
>它返回最新行使的计数器,but that’s for all tables.你不能用它来返回MS Access中特定表的计数器(据我所知,假如你行使FROM mytable指定一个表,它就会被忽略).
简而言之,返回的值也许与您祈望的值完全差异.
>您必需在INSERT之后直接查询它,以最洪流平地低落得到错误谜底的风险.
这意味着,假如您一次插入数据并必要在另一个时刻(或其他处所)获取最后一个ID,则无法行使.
>最后但并非最不重要的是,仅当通过编程代码插入记录时才配置变量.
这意味着通过用户界面添加了记录,将不会配置@@ IDENTITY.

(*):为了清晰起见,@@ IDENTITY示意差异,而且以更具猜测性的方法,假如您对数据库行使ANSI-92 SQL模式.但题目是ANSI 92的语法略有差异Access支持的ANSI 89气魄威风凛凛,旨在当Access用作前端时增进与SQL Server的兼容性.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读