7

我有如下代码,我尝试将数据插入表中并返回新元素的 ID(由自动增量给出)。

int newEquipmentID = new int();

query = database.ParameterizedQueryString("INSERT INTO Equipment (EquipmentTypeID) VALUES ({0})", "equipmenttypeID");

newEquipmentID = (int)database.Connection.ExecuteScalar(query, DefaultTimeout, equipment.EquipmentTypeID);

但它失败并返回 null,就好像尚未添加新项目一样。但实际上我可以看到新项目在数据库中进行了简单的咨询。

我的问题是“何时”将数据实际添加到数据库中,以及如何获取新添加项目的 ID。谢谢!

4

4 回答 4

15

您不需要两个查询来创建新记录并检索新的身份值:

using (var con = new SqlConnection(ConnectionString)) {
    int newID;
    var cmd = "INSERT INTO foo (column_name)VALUES (@Value);SELECT CAST(scope_identity() AS int)";
    using (var insertCommand = new SqlCommand(cmd, con)) {
        insertCommand.Parameters.AddWithValue("@Value", "bar");
        con.Open();
        newID = (int)insertCommand.ExecuteScalar();
    }
}

旁注:我不会使用这样的数据库类,因为它容易出错

于 2012-04-18T14:07:26.033 回答
3

您的 SQL 查询不会返回新生成的 Id。要返回它,请使用一个OUTPUT子句

INSERT INTO Equipment (<list of fields>) 
    OUTPUT inserted.EquipmentTypeID 
VALUES (<list of values>)

需要注意的一些事项:

  • <list of fields>表示您将为其提供值的列的逗号分隔列表
  • 字段列表不应包含自动递增 ID 列(将自动分配一个值)
  • <list of values>表示将插入上述指定字段的逗号分隔值列表。值的数量应该等于字段的数量并且数据类型必须匹配
于 2012-04-18T14:06:33.707 回答
2

要返回刚刚插入的行的 id,您需要选择它,因为ExecuteScalar()返回

查询返回的结果集中第一行的第一列

并且INSERT不选择/返回任何东西。

insert ...
select ...

有关更多详细信息,请参阅@Tim 的答案。

于 2012-04-18T14:04:20.823 回答
0

OUTPUT 子句将帮助您获取新添加项目的 ID。欲了解更多信息,请参阅以下链接:

点击这里!了解更多详情

于 2012-04-18T14:09:44.727 回答