开发者社区 问答 正文

INSERT语句后的@@ IDENTITY始终返回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连接,Provider = Microsoft.Jet.OLEDB.4.0的MS Access数据库

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-18 16:25:46 546 分享 版权
1 条回答
写回答
取消 提交回答
  • 1)将INSERT和SELECT语句(使用“;”连接)组合成1个db命令

    2)使用SCOPE_IDENTITY()代替@@ IDENTITY

    插入blabla ...; 从表WHERE OID = SCOPE_IDENTITY()中选择SELECT OID

    -更新:

    由于事实证明该问题与MS ACCESS有关,因此我发现本文建议仅重复使用第一个命令并将其CommandText设置为“ SELECT @@ IDENTITY”就足够了。

    2019-11-18 16:25:57
    赞同 展开评论
问答分类:
问答地址: