如何使用Excel VBA获取新插入记录的id?

2023-11-24

这似乎是一个很常见的问题,但大多数解决方案都涉及连接多个 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目前。为了将来的参考,我有兴趣看看我上面的尝试有什么问题。


关于你的问题:

我现在正在尝试更新一个表 没有太大的余地 独特性,除了 人工主键。这意味着 存在新纪录的风险 可能不是独一无二的,我讨厌 添加一个字段只是为了强制唯一性。

If you are使用自动增量作为主键,那么您就具有唯一性,并且可以使用SELECT @@Identity;获取最后一个自动生成的 ID 的值(请参阅下面的注意事项)。

如果你是not使用自动增量,并且您正在从 Access 插入记录,但想要从 Excel 检索最后一条记录:

  • 确保您的主键是可排序的,以便您可以使用以下任一查询获取最后一个主键:

    SELECT MAX(MyPrimaryField) FROM MyTable;
    SELECT TOP 1 MyPrimaryField FROM MyTable ORDER BY MyPrimaryField DESC;
    
  • 或者,如果对主字段进行排序不会给您提供最后一个字段,则您需要添加一个日期时间字段(例如InsertedDate)并在每次在该表中创建新记录时保存当前日期和时间,以便您可以获得最后一个记录,如下所示:

    SELECT TOP 1 MyPrimaryField FROM MyTable ORDER BY InsertedDate DESC;
    

在这两种情况下,我认为您会发现添加自动增量主键更容易处理:

  • 这不会花费你太多

  • 它将保证您的记录的唯一性,而无需考虑它

  • 这将使您更轻松地选择最新记录,可以使用@@Identity或通过按主键排序或获取Max().

来自 Excel

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

  • 使用查询创建数据链接,以便您可以直接在单元格或区域中使用结果。

  • 从 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, adOpenStatic, adLockReadOnly
        GetLastPrimaryKey = rs.Fields(0).Value
        rs.Close
        Set rs = Nothing
    End Sub
    

注意事项@@Identity

你必须的小心注意事项使用时@@Identity在标准 Access 数据库中(*):

  • 它仅适用于自动增量标识字段。

  • 仅当您使用 ADO 并运行时才可用SELECT @@IDENTITY;

  • 它返回最新使用的计数器,但这是为了所有桌子。您不能使用它来返回 MS Access 中特定表的计数器(据我所知,如果您使用FROM mytable,它只是被忽略)。
    简而言之,返回的值可能根本不是您期望的值。

  • 您必须在INSERT以尽量减少得到错误答案的风险。
    这意味着,如果您一次插入数据并需要在另一时间(或另一地点)获取最后一个 ID,则它将不起作用。

  • 最后但并非最不重要的一点是,仅当通过编程代码插入记录时才会设置该变量。
    这意味着记录是通过用户界面添加的,@@IDENTITY不会被设置。

(*):为了清楚起见,@@IDENTITY如果您对数据库使用 ANSI-92 SQL 模式,则行为会有所不同,并且更具预测性。
但问题是 ANSI 92 的语法与 Access 支持的 ANSI 89 风格,旨在提高将 Access 用作前端时与 SQL Server 的兼容性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Excel VBA获取新插入记录的id? 的相关文章

  • Excel:查找和替换宏 - 仅一列

    我编写了一些宏来将大量数据格式化为相同的可接受格式 我们从中提取的程序拒绝按照我们想要的方式提取数据 但理论上在 Excel 中更改并不难 它设置运行的方式是为修饰符使用单独的宏 然后使用 全部运行 宏来调用所有修饰符 目前我有 Sub R
  • INNER JOIN 可用作 SELECT,但不能用作 DELETE [重复]

    这个问题在这里已经有答案了 为什么这个有语法错误 DELETE FROM print mailing request pmr INNER JOIN person p ON p id pmr person AND p email LIKE T
  • 如何在 SQLite 中获取最后插入的 ID?

    SQLite 中是否有任何内置函数可以获取最后插入的行 ID 例如 在 mysql 中我们有LAST INSERT ID 这种功能 对于 sqlite 任何可用于执行相同过程的函数 请帮我 Thanks SQLite 这可以使用SQLite
  • MySQL 中的 UDF 性能

    我注意到 当查询在 SELECT 或 WHERE 子句中调用 UDF 时 MySQL 查询执行时间的性能会呈指数级下降 有问题的 UDF 查询本地表以返回标量值 因此它们不仅执行算术表达式 而且充当相关子查询 我通过简单地删除 UDF 并使
  • SQL Server递归查询显示父级路径

    我正在使用 SQL Server 语句并有一张表 例如 item value parentItem 1 2test 2 2 3test 3 3 4test 4 5 1test 1 6 3test 3 7 2test 2 我想使用 SQL S
  • ActiveRecord 嵌套 SELECT——我可以在没有手动 SQL 的情况下完成它吗?

    我有一张桌子 上面有 除其他外 一个名字和一个等级 我想返回所有唯一名称的集合 但对于返回的每个名称 我想选择排名最高的行 这很简单 有两个嵌套的 SELECT 语句 SELECT FROM SELECT FROM foo ORDER BY
  • 将此 MySQL 查询转换为 PyGreSQL

    我正在开发一个 Ruby 应用程序 它使用 mysql 函数 XOR 和 BIT COUNT 不过 我现在需要在运行 PyGreSQL 的 Heroku 上运行该应用程序 我找不到任何可以帮助我的 PyGreSQL 文档 那么任何人都可以翻
  • 多级排序

    我有一个表 其中包含一些记录 其中包含名称 评级等字段 我首先想要根据评级将结果限制为 20 进行排序 然后在此结果集上想要进一步应用基于名称的排序 我知道要排序我们需要使用像这样的查询 Select from table order by
  • SQLite 条件 ORDER BY 中的 DESC

    我需要选择按以下逻辑排序的记录 但是当 DESC 处于条件中时 SQLite 会引发错误 ORDER BY CASE WHEN parentGUID IS NULL THEN datePosted DESC ELSE datePosted
  • 如何连接以逗号分隔的命名范围的返回值

    我花了几个小时试图找出如何连接命名范围中的返回值 但结果是 运行时错误 32 类型不匹配 作为一个新手 我仍在与数组作斗争 所以也许我忽略了一些细节 谢谢你帮助我 示例 B1 苯 B2 柴油 B3 混合动力 gt E1 汽油 E2 柴油 E
  • 从新的 xlsx 文件中删除宏

    功能部分 下面的代码将 xlsm 文件中的 2 个选项卡保存到新的 xlsx 文件中 文件保持打开状态以进行编辑 错误 xlsm 选项卡在工作表代码中有触发器 该触发器无效 一旦在 xlsx 工作表中输入任何内容 就会导致错误 所需输出 编
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T
  • Excel VBA 多张表求和

    我正在尝试创建一个或多个函数 可以将每个客户的考勤卡每日工作时间相加 得出每天的总工作时间 每个客户在一个工作簿中都有自己的工作表 目前 我有一个函数可以确定与第一个客户一起使用的工作表 工作簿中的第三个工作表 Function First
  • 在 SQL Server SELECT 语句中使用 CASE 时消除 NULL

    我有一份大而混乱的报告要写 它连接了 5 个表 一个表中有一列用于多个不同的值 本质上是一个 标签 列 其中标签根据用户想要使用的各种元数据的类型以创造性的方式使用 因此 我对报告的查询返回 3 个几乎相同的行 仅 标签 列有所不同 例如
  • 尝试使用 sql 获取单行结果? [复制]

    这个问题在这里已经有答案了 我正在尝试显示所有员工 ID 我需要这样的结果 emp id 10 11 12 13 14 15 当尝试时 SELECT LISTAGG emp id WITHIN GROUP ORDER BY emp id A
  • 在 Sql Server 中启用 DTD 支持

    我有各种 xml 文档需要存储在数据库列中 这些文档包含对 DTD 的引用 并且 SQL Server 不会导入 xml 因为它存在安全风险 如何在数据库上启用 DTD 支持 以便它可以让我插入 xml 内容 你必须CONVERT首先 MS
  • MySql 复合索引

    我们使用 MySql 作为我们的数据库 以下查询在 mysql 表 大约 2500 万条记录 上运行 我在这里粘贴了两个查询 查询运行得太慢 我想知道更好的复合索引是否可以改善这种情况 你知道最好的综合指数是什么吗 并建议我这些查询是否需要
  • DB2 - 如何在 IBM System i Access for Windows GUI Tool 中使用参数运行即席选择查询

    我想使用我声明的变量在 IBM System I Navigator tool for DB2 中运行一些临时选择语句 例如 在 SQL Server 世界中 我可以在 SQL Server Management Studio 查询窗口中轻
  • PLSQL 中的时区转换

    我需要将系统日期和时间转换为特定时区 例如东部时间 我无法假设我当前的时区 如何在plsql中转换它 请帮我 假设你有一个TIMESTAMP WITH TIME ZONE 例如systimestamp 您可以使用AT TIME ZONE句法
  • 如何在没有聚合函数的情况下在sql server中创建枢轴查询

    我正在使用 MS SQL SERVER 2008 并且有以下数据 select from account PERIOD ACCOUNT VALUE 2000 Asset 205 2000 Equity 365 2000 Profit 524

随机推荐

  • 如何强制 Internet Explorer 以标准模式而不是怪异模式呈现?

    我正在编写一个在 IE7 标准模式和 IE8 标准模式下运行良好的前端 当我启动 Internet Explorer 并加载页面时 IE7 和 IE8 都会直接进入 Quirks 模式 如何强制 IE7 和 IE8 始终以标准模式加载页面
  • sympy 中的多项式因式分解

    我正在做一个非常简单的概率计算 从 A Z 集合中获取 X Y Z 的子集 具有相应的概率 x y z 由于公式非常繁重 为了处理它们 我正在尝试simplify or collect or factor 我不知道确切的定义 这些多项式表达
  • 访问 UIWebView 的 JavaScriptCore 引擎

    我刚刚发现了 iOS7 中可用的新框架 JavaScriptCore 它看起来很棒 但是我如何访问运行时 上下文UIWebView 对此没有官方机制 但我知道有两种方法可以得到JSContext 我可能不会在运输应用程序中使用任何一个 使用
  • jQuery.ajax() 中的“async: false”有什么作用?

    具体来说 它与默认值有何不同 async true 在什么情况下我想显式设置async to false 这是否与阻止页面上的其他事件触发有关 有什么关系吗 阻止页面上的其他事件 从射击 Yes 将 async 设置为 false 意味着您
  • [PersistenceException:获取序列 nextval 时出错]

    我在尝试将数据保存到数据库中的模型时收到此错误 Entity public class User extends Model Required public String name Email public String email Req
  • 路由,参数数量无限

    例如 链接 shop phones brend apple display retina color red where phones category alias brend name of attribute apple attribu
  • 斐波那契数列的表现

    f 0 0 f 1 1 f x f x 1 f x 2 该函数在 Mathematica 中运行缓慢 我需要提高速度 我必须使用函数式编程和递归 我不确定为什么它运行得这么慢 即使是最轻微的想法如何改进它也会有所帮助 编写更快的递归函数的一
  • AVAudioEngine 寻找歌曲的时间

    我正在使用播放歌曲AVAudioPlayerNode我试图用一个来控制它的时间UISlider但我不知道如何利用AVAUdioEngine 经过多次尝试和错误 我想我终于明白了这一点 首先 您需要计算文件的采样率 为此 获取 AudioNo
  • 确保所有图块均加载到 Open Layers 3 XYZ 源中

    我们有一些层利用ol source XYZ来源 对于我们使用的加载策略ol loadingstrategy tile new ol tilegrid createXYZ 在进行其他操作之前 我们需要确保所有图块已完全加载到地图视图中 我们已
  • Scipy:使用optimize.leastsq时拟合参数的界限

    我正在使用 optimization leastsq 来拟合数据 我想将拟合参数限制在一定范围内 使用optimize leastsq时是否可以定义边界 边界是在optimize fmin slsqp中实现的 但我更喜欢使用optimize
  • JOIN 或关联子查询与存在子句,哪个更好

    select from ContactInformation c where exists select from Department d where d Id c DepartmentId select from ContactInfo
  • 即使引发异常,AssertRaises 也会失败

    我遇到了以下相当奇怪的问题 我正在开发一个 django 应用程序 在我的模型类中 我定义了一个在验证失败时应引发的异常 class MissingValueException Exception Raise when a required
  • 准备好的语句参数索引超出范围 (0 < 1 )

    我不是 Web 应用程序方面的专家 最近正在使用 servlet 为我的移动应用程序编写一个小型 Web 应用程序 我的议程是从客户端接收数据 并将其放入数据库 一切都运行良好 除了我的数据库插入语句 它试图使用PreparedStatem
  • 错误:在 Android Studio 中必须具有透明或白色的单像素框架

    我刚刚将一个项目从 eclipse 导入到 Android studio 几乎对于每第二张图像 android studio 都会给出以下错误 Error Must have one pixel frame that is either t
  • 在 iOS 7 中获取联系人

    此代码适用于 iOS 5 iOS 6 但不适用于 iOS 7 CFErrorRef error NULL ABAddressBookRef addressBook ABAddressBookCreateWithOptions NULL er
  • scikit-learn 交叉验证,带有均方误差的负值

    当我将以下代码与数据矩阵一起使用时X大小 952 144 和输出向量y尺寸 952 mean squared errormetric 返回负值 这是意外的 你有什么主意吗 from sklearn svm import SVR from s
  • Sitecore 工作流程和标准值继承的烦人问题

    现在我在 sitecore 工作流程方面遇到问题 问题如下 我的模板标准值已设置工作流程和默认工作流程字段集 工作流程状态设置为草稿 但是 每次我从此模板创建项目时 它都不会继承工作流程部分字段 所有字段都是空的 如果我手动设置项目的工作流
  • Dart:使用正则表达式删除字符串中的空格

    我正在尝试使用 Dart 和 Regexp 删除字符串中的所有空格 给定以下字符串 test test1 test2 我想得到 testtest1test2 我已经阅读了 javascript 中的一些示例 但它们似乎在 Dart 中不起作
  • 如何有效地处理 maven-3 带时间戳的快照?

    现在 maven 3 做到了放弃支持对于快照工件的 false 您似乎确实需要使用带时间戳的快照 特别是 m2eclipse 它在内部使用 maven 3 似乎受到它的影响 当快照不唯一时 更新快照不起作用 看起来最好之前练习将所有快照设置
  • 如何使用Excel VBA获取新插入记录的id?

    这似乎是一个很常见的问题 但大多数解决方案都涉及连接多个 SQL 命令 我相信这是 ADO VBA 无法完成的 不过 我很高兴在这方面被证明是错误的 我当前插入新记录 然后使用 我希望 足够的字段运行选择查询 以保证仅返回新插入的记录 我的