【问题标题】:@@Identity returns 0 from Access Frontend (SQL Server Express backend)@@Identity 从访问前端(SQL Server Express 后端)返回 0
【发布时间】:2014-10-08 00:16:08
【问题描述】:

我一直在网上寻找解决此问题的方法,所有答案似乎都告诉我我这样做是正确的。我继承了这个 Access / SQL Server 数据库,但我似乎无法让这部分工作。

我正在执行一个相当基本的 SQL INSERT 查询,它工作正常。我已经检查了好几次。查询执行后,我将尝试从中获取标识值以用于我的其余代码。

这是我的代码:

db.Execute (SQLStr)

Set rs = db.OpenRecordset("SELECT @@IDENTITY")
InNo = rs(0)
Debug.Print InNo
rs.Close
db.Close

这始终为InNo 返回值 0。我尝试了几种不同的方法,但似乎无法正常工作。

我也直接从 SQL Server 使用过这种方法,查询@@Identity 工作正常。

提前致谢。

【问题讨论】:

  • 我建议使用 SCOPE_IDENTITY() 而不是其他任何东西来获取新插入的标识值。 See this blog post for an explanation as to WHY
  • 我相信你必须加入这两个 SQL 语句 - 它们在不同的上下文中执行,所以第二个语句没有相同的范围。是的,也可以使用SCOP_IDENTITY()
  • 您应该创建一个插入存储过程并为 SCOPE_IDENTITY 创建一个插入存储过程并包含和 OUTPUT 参数,而不是使用 pass through sql(顺便说一句,这很可能容易受到 sql 注入的攻击)。这使您可以更好地控制正在发生的事情,并且您将拥有参数化查询,而不是执行带有用户输入的字符串。
  • marc_s - 我已阅读该内容,但无法使其正常工作。你有什么代码建议吗?
  • Sean - 这只是一个内部数据库,所以我不太担心安全性(尤其是因为我的用户中有 99% 是计算机文盲。),但我会看看存储过程。

标签: sql-server ms-access identity-column


【解决方案1】:

我怀疑你在本地 Access 数据库上运行 SELECT @@IDENTITY,当然不知道 @@IDENTITY 是什么。

不过,我不能 100% 确定,因为您没有显示整个代码,而且我不知道 db 是什么。
如果dbCurrentDB,则Set rs = db.OpenRecordset 行打开一个DAO.Recordset确实在您的本地 Access 数据库上执行查询。

如果我的怀疑是正确的,那么你需要通过pass-through query打开你执行SELECT @@IDENTITY的记录集,这样它才真正运行在SQL Server上。

【讨论】:

  • 对不起,我的复制粘贴有点小气。我正在使用 currentdb,我所有的表都是来自 SQL Server 的链接表。
  • 我是这么认为的。所以我是对的 - 你需要通过传递查询执行SELECT @@IDENTITY,所以它实际上是由 SQL Server 执行的,而不是由 Access 执行的。
  • 那行得通。不得不去找出如何编写一个通过查询来做到这一点,但它显着清理了我的代码,它现在实际上可以工作了。
猜你喜欢
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多