C#和#x2B;SQL Server ExecuteScalar()未返回上次插入的id

C#和#x2B;SQL Server ExecuteScalar()未返回上次插入的id,c#,sql-server,C#,Sql Server,我有以下函数,它执行一个查询并在成功时返回true,在失败时返回false。不,我想扩展该方法,以便在触发每个插入查询时,类varinsertId包含最后插入行的ID 问题是insertId始终为0,因此executeScalar()不知何故没有返回ID 有什么想法吗?或其他解决方案来获取最后一个插入查询的ID public int insertId; public bool executeCommand(string q) { q += ";

我有以下函数,它执行一个查询并在成功时返回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;
    }

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

您应该更改
insert
以立即将插入的ID返回给您(在
输出
子句中)!这适用于SQL Server 2005上-SQL Server 2000或更早版本中没有
输出
子句(您没有指定您在问题中使用的SQL Server的版本)。请阅读更多有关该网站的信息

将插入内容更改为类似以下内容:

INSERT INTO dbo.YourTable(Col1, Col2, ..., ColN)   
OUTPUT Inserted.ID
VALUES(Val1, Val2, ..., ValN);
然后,当您从C#执行insert语句时,您应该能够执行以下操作:

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

您的
结果
变量现在应该包含正确的、新插入的值

我用的是2005年的版本。。。我将尝试这个,但这将是一些工作,因为所有的插入查询都已编写。。。编辑:谢谢!这样做成功了,结果现在包含插入行的id,非常感谢。但请记住,Inserted.ID表示ID列的Inserted.name:)Muchas gracias,functiona de maravilla:D