2014-10-07 102 views
1

我一直在网络上寻找解决方法,所有的答案似乎告诉我,我正确地做到了这一点。我已经继承了这个Access/SQL Server数据库,而且我似乎无法让这一块工作。@@ Identity从Access前端返回0(SQL Server Express后端)

我正在执行相当基本的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工作正常。

在此先感谢。

+0

我会推荐使用** SCOPE_IDENTITY()**而不是其他任何东西来抓取新插入的标识值。 [请参阅此博客文章,了解有关WHY的解释](http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity -of-record /) – 2014-10-07 16:04:26

+0

我相信你必须加入两条SQL语句 - 它们在不同的上下文中执行,所以第二条语句的范围并不相同。是的,也使用'SCOP_IDENTITY()'。 – Luaan 2014-10-07 16:07:18

+0

您应该创建一个插入存储过程,并为SCOPE_IDENTITY创建一个包含和OUTPUT参数,而不是使用传递sql(btw很可能容易受到sql注入攻击)。这使您可以更好地控制发生的事情,并且您将拥有参数化查询,而不是使用用户输入执行字符串。 – 2014-10-07 16:10:03

回答

0

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

虽然我不是100%确定,因为你没有显示你的整个代码,我不知道db是什么。
如果dbCurrentDB,那么Set rs = db.OpenRecordset行打开DAO.Recordset,其中确实执行您的本地Access数据库上的查询。

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

+0

对不起,我的复制粘贴有点吝啬。我正在使用currentdb,并且我的所有表都是来自SQL Server的链接表。 – andrews 2014-10-07 16:21:20

+0

我以为是。所以我是对的 - 你需要通过传递查询来执行SELECT @@ IDENTITY,所以它实际上是由SQL Server执行的,而不是由Access执行的。 – 2014-10-07 16:22:39

+0

这有效。必须去找出如何编写一个传递查询来做到这一点,但它显着清理了我的代码,现在它实际上工作。 – andrews 2014-10-08 17:08:18