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

时间:2014-11-11 15:54:06

标签: c# asp.net ms-access ado.net oledb

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

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年或更早版本(确切地说不确定)。

5 个答案:

答案 0 :(得分:3)

  

ms access db是2003年或更早版本(确切地说不确定)

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

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

为您的查询创建两个不同的命令,然后执行非查询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();
    }
}

答案 3 :(得分:0)

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

再次感谢

答案 4 :(得分:0)

我的旧数据库(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()