在Access中选择@@IDENTITY始终返回0

本文关键字:返回 @@IDENTITY Access 选择 | 更新日期: 2023-09-27 18:30:04

我一直在努力寻找这个问题的解决方案,但到目前为止都没有成功。

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数据库是2003或更旧版本(不完全确定)。

在Access中选择@@IDENTITY始终返回0

ms访问数据库是2003或更旧版本(不确切)

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

如果您希望SELECT @@IDENTITY正常工作,则需要将数据库文件升级到较新版本。

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

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

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

此外,为了验证,您要插入的表确实有一个自动递增列,这是正确的吗?否则,@@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年,这就是问题所在。a一尝试新的access 2010文件,它就工作了。

再次感谢

我的解决方案与我的旧数据库(VB6和ACCESS)用VBNET和之前的数据库升级到4。

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

MyInsertCommand.CommandText="通过ME_idn Desc从网格顺序中选择前1个ME_idn";

Dim MyInsertIdn As Integer=MyInsertCommand.ExecuteScaler()