c# + SQL Server ExecuteScalar()没有返回最后插入的id

本文关键字:返回 最后 插入 id SQL Server ExecuteScalar | 更新日期: 2023-09-27 18:16:31

我有以下函数执行查询,成功返回true,失败返回false。不,我想扩展该方法,以便在触发的每个插入查询中,类var insertId包含最后插入行的ID。

问题是insertId总是0,所以不知何故executeScalar()没有返回ID。

任何想法?或其他获取最后插入查询ID的解决方案....

    public int insertId;        
    public bool executeCommand(string q) {
        q += "; SELECT @@IDENTITY AS LastID";
        bool retour = true;
        SqlConnection myCon = new SqlConnection(Settings.DSN);
        SqlCommand cmd = new SqlCommand(q, myCon);
        try {
            cmd.Connection.Open();
            insertId = (int)cmd.ExecuteScalar();
            if (insertId > 0) {
                MessageBox.Show(insertId.ToString());
            }
            myCon.Close();
        } catch (Exception ex) {
            this.error = ex.Message;
            retour = false;
        }
        return retour;
    }

c# + SQL Server ExecuteScalar()没有返回最后插入的id

您应该更改您的INSERT以立即返回插入的ID给您(在OUTPUT子句中)!这适用于SQL Server 2005上- OUTPUT子句在SQL Server 2000或更早版本中不可用(您没有指定您在问题中使用的SQL Server的哪个版本…)。有关OUTPUT条款的更多信息,请访问MSDN Books Online。

将插入内容改为:

INSERT INTO dbo.YourTable(Col1, Col2, ..., ColN)   
OUTPUT Inserted.ID
VALUES(Val1, Val2, ..., ValN);

,然后当你从c#中执行插入语句时,你应该能够:

using(SqlCommand cmdInsert = new SqlCommand("INSERT.....", myCon))
{
   myCon.Open();
   var result = cmdInsert.ExecuteScalar();
   myCon.Close();
}

result变量现在应该包含正确的,新插入的值!

尝试SCOPE_IDENTITY()而不是@@IDENTITY,如果这不起作用,您可以发布表模式和您正在运行的插入查询