sql – @@ IDENTITY之后,INSERT语句总是返回0

我需要一个数据库上执行INSERT语句并返回Auto_Increment主键的函数.我有以下C#代码,但是当INSERT语句工作正常(我可以看到数据库中的记录,PK正确生成,行== 1),id值始终为0.任何想法可能会发生错误
public int ExecuteInsertStatement(string statement)
    {
        InitializeAndOpenConnection();
        int id = -1;


        IDbCommand cmdInsert = connection.CreateCommand();
        cmdInsert.CommandText = statement;
        int rows = cmdInsert.ExecuteNonQuery();

        if (rows == 1)
        {
            IDbCommand cmdId = connection.CreateCommand();
            cmdId.CommandText = "SELECT @@Identity;";
            id = (int)cmdId.ExecuteScalar();
        }

        return id;
    }
    private void InitializeAndOpenConnection()
    {
        if (connection == null)
            connection = OleDbProviderFactory.Instance.CreateConnection(connectString);

        if(connection.State != ConnectionState.Open)                 
            connection.open();
    }

为了回答答案,我试过:

public int ExecuteInsertStatement(string statement,string tableName)
    {
        InitializeAndOpenConnection();
        int id = -1;
        IDbCommand cmdInsert = connection.CreateCommand();
        cmdInsert.CommandText = statement + ";SELECT OID FROM " + tableName + " WHERE OID = ScopE_IDENTITY();";
        id = (int)cmdInsert.ExecuteScalar();

        return id;
    }

但是我现在得到错误sql语句结束后找到的字符”

我正在使用具有OleDb连接的MS Access数据库,Provider = Microsoft.Jet.OLEDB.4.0

解决方法

1)将INSERT和SELECT语句(使用“;”连接)组合成1个db命令

2)使用ScopE_IDENTITY()而不是@@ IDENTITY

INSERT INTO blabla …; SELECT OID FROM table WHERE OID = ScopE_IDENTITY()

– 更新:

因为事实证明这个问题与MS ACCESS相关,所以我发现this article表明只需重新使用第一个命令并将其CommandText设置为“SELECT @@ IDENTITY”就足够了.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...