ExecuteScalar()返回null,尽管数据已添加到DB

时间:2012-04-18 14:03:10

标签: c# sql tsql ado.net executescalar

我有一个代码如下所示,我尝试将数据插入表中并返回新元素的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 个答案:

答案 0 :(得分:12)

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

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();
    }
}

侧注:我不会使用it's prone to errors之后的数据库类。

答案 1 :(得分:2)

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

  

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

INSERT不会选择/返回任何内容。

insert ...
select ...

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

答案 2 :(得分:1)

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

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

有些事情需要注意:

  • <list of fields>表示以逗号分隔的列列表,您将为其提供值
  • 字段列表不应包含自动增量ID列(将自动分配值)
  • <list of values>表示将在上述指定字段中插入的以逗号分隔的值列表。值的数量应等于字段数,数据类型必须匹配

答案 3 :(得分:0)

OUTPUT子句将帮助您获取新添加项目的ID。有关详细信息,请参阅以下链接:

点击here!更多细节