Access中的SELECT @@ IDENTITY始终返回0

我一直试图找到解决这个问题的方法,但到目前为止还没有任何效果。

private void Insert() { string ConnectionStringAccess = Provider=Microsoft.ACE.OLEDB.12.0;Data Source=###Jet OLEDB:Database Password=###; string query2 = "Select @@Identity"; int id = -1; string Query = "INSERT INTO tblTable (EmpNo, Name) VALUES (132, 'TestName');"; OleDbConnection con = new OleDbConnection(ConnectionStringAccess); OleDbCommand cmd = new OleDbCommand(Query, con); try { con.Open(); if (cmd.ExecuteNonQuery() == 1)//the insert succeded { cmd.CommandText = query2; id = Convert.ToInt32(cmd.ExecuteScalar()); } } catch (Exception ex) { //log the ex } finally { con.Dispose(); con.Close(); } } 

每次我使用上面的方法时,我总是在“id”中返回0。 我究竟做错了什么? 我尝试使用不同的连接字符串或其他方式来获取最新的标识符:

  • 提供商= Microsoft.Jet.OLEDB.4.0;
  • SCOPE_IDENTITY()

但又一无所获。 Access db是2003或更早版本(确切地说不确定)。

ms access db是2003或更早版本(不确定)

我能够使用Access 97数据库重新创建您的问题。 SELECT @@IDENTITY与Access 2000数据库文件一起正常工作(即使从与INSERT相同的OleDbCommand对象运行),但在对Access 97数据库运行时它总是返回零。

如果您希望SELECT @@IDENTITY工作,您似乎需要将数据库文件升级到更新的版本。

您正在使用相同的命令对象来插入和检索@@ identity。

根据本文,您应该创建一个单独的命令对象来检索@@ identity值:

http://support.microsoft.com/kb/815629

另外,为了validation,您要插入的表确实有一个自动增量列,这是正确的吗? 如果没有,@@ identity将不会返回任何内容。

为查询创建两个不同的命令,执行非查询然后执行标量 。 它将返回查询返回的结果集中第一行的第一列,它应该是您要查找的ID。

 private void Insert() { string ConnectionStringAccess = Provider=Microsoft.ACE.OLEDB.12.0;Data Source=###Jet OLEDB:Database Password=###; int id = -1; string Query = "INSERT INTO tblTable (EmpNo, Name) VALUES (132, 'TestName')"; string Query2 = "SELECT @@Identity"; OleDbConnection con = new OleDbConnection(ConnectionStringAccess); OleDbCommand cmd = new OleDbCommand(Query, con); OleDbCommand cmd2 = new OleDbCommand(Query2, con); try { con.Open(); cmd.ExecuteNonQuery(); id = (int)cmd2.ExecuteScalar(); } catch (Exception ex) { //log the ex } finally { con.Dispose(); con.Close(); } } 

感谢所有的回复。 我发现了问题所在。 显然,访问文件很老,1997年确切,这就是问题所在。 一旦尝试了新的访问2010文件,它就有效了。

再次感谢