【问题标题】:How to obtain last insert id? [duplicate]如何获取最后一个插入 id? [复制]
【发布时间】:2017-01-11 23:09:43
【问题描述】:

我想插入两个表,同时获取最后插入的 id,然后将其添加到第二个表中。我已经尝试过使用 ExecuteNonScalar 但它没有用。这是我的代码:

string iquery = "insert into [User] (username, password, role) values (@username,@password,@role)";
                        SqlCommand cmd = new SqlCommand(iquery, conn);
                        cmd.Parameters.AddWithValue("@username", username);
                        cmd.Parameters.AddWithValue("@password", password);
                        cmd.Parameters.AddWithValue("@role", "Customer");
                        cmd.ExecuteNonQuery();
                        //get last insert User ID, insert into borrower 
                        int id = Convert.ToInt32(cmd.ExecuteScalar());
                        string iquery2 = "insert into [borrower] (userid, name, phone, email, type) values (@id, @name, @phone, @email, @type)";
                        SqlCommand cmd1 = new SqlCommand(iquery2, conn);
                        cmd1.Parameters.AddWithValue("@id", id);
                        cmd1.Parameters.AddWithValue("@name", name);
                        cmd1.Parameters.AddWithValue("@phone", phone);
                        cmd1.Parameters.AddWithValue("@email", email);
                        cmd1.Parameters.AddWithValue("@type", type);
                        cmd1.ExecuteNonQuery();

当我编译并运行代码时,插入的 id 为 0。知道我做错了什么吗?

【问题讨论】:

    标签: c# sql


    【解决方案1】:

    你应该修改一下你的 sql 语句:

    string iquery = "insert into [User] 
                     (username, password, role) 
                     values (@username,@password,@role)
                     select scope_identity()";
    

    基本上,SCOPE_INDETITY

    返回插入到标识列中的最后一个标识值 范围相同。

    欲了解更多信息,请查看here

    此外,您之前不需要cmd.ExecuteNonQuery();

    int id = Convert.ToInt32(cmd.ExecuteScalar());
    

    【讨论】:

    • 所以 executenonquery 和 executescalar 做同样的事情,好的,谢谢
    • @eBourgess 不,他们不会做同样的事情。您可以调用其中一个,它们用于不同的目的。 ExecuteNonQuery 针对连接执行 Transact-SQL 语句并返回受影响的行数。而ExecuteScalar执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。在你的情况下,后者是好的。但是,您可以使用ExecuteNonQuery 来解决问题(前提是您将更改一点您的 sql 语句)。
    • 好的,现在它对我有用,您解决了另一个问题,即双重插入表格。感谢您的时间和解释
    • 不客气!我很高兴能帮上忙:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2011-04-30
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2012-02-12
    • 2016-09-29
    相关资源
    最近更新 更多