在 Access 中选择 @@IDENTITY 总是返回 0

Posted

技术标签:

【中文标题】在 Access 中选择 @@IDENTITY 总是返回 0【英文标题】:SELECT @@IDENTITY in Access always returning 0 【发布时间】:2014-11-11 15:54:06 【问题描述】:

我一直在尝试找到解决此问题的方法,但到目前为止没有任何效果。

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。我究竟做错了什么?我尝试使用不同的连接字符串或其他方式来获取最新的标识符:

Provider=Microsoft.Jet.OLEDB.4.0; SCOPE_IDENTITY()

但又没有。 Access db 是 2003 或更早版本(不确定)。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

干得好,戈德。微软确认"This feature works with Jet 4.0 databases but not with older formats."【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

为您的查询创建两个不同的命令,执行非查询然后execute scalar。它将返回查询返回的结果集中第一行的第一列,它应该是您要查找的 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();
    

【讨论】:

不,这不适用于 Access。 Access 数据库引擎不支持单个 SQL 字符串中的多个语句。 @GordThompson 是的,你是对的,我更正了我的答案,谢谢【参考方案4】:

感谢所有回复。我发现了问题所在。显然访问文件很旧,确切地说是 1997 年,这就是问题所在。一旦尝试了新的 access 2010 文件,它就可以工作。

再次感谢

【讨论】:

很高兴听到您解决了问题。你可以考虑accepting我上面的回答。【参考方案5】:

我对非常​​旧的数据库(VB6 和 ACCESS)的解决方案 使用 VB NET 并在将数据库升级到 4 之前。

'MyInsertCommand.CommandText = "Select @@Identity" 不要使用旧的 Access 数据库

MyInsertCommand.CommandText = "SELECT TOP 1 ME_idn FROM MESURE ORDER BY ME_idn Desc"

Dim MyInsertIdn As Integer = MyInsertCommand.ExecuteScalar()

【讨论】:

以上是关于在 Access 中选择 @@IDENTITY 总是返回 0的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access 中的 Scope_Identity()

AWS: IAM - Identity Access Management

如何检索 MS-Access 中的最后一个自动增量值,例如 Sql Server 中的 @@Identity

Google Cloud资源层级, IAM Identity and Access Management, 控制台云交互

总是从 Identity Server 获取“invalid_client”

security find-identity 列出了一个身份,但我在 Keychain Access 中找不到该身份