我有一个代码如下所示,我尝试将数据插入表中并返回新元素的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。 谢谢!
答案 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>
表示以逗号分隔的列列表,您将为其提供值<list of values>
表示将在上述指定字段中插入的以逗号分隔的值列表。值的数量应等于字段数,数据类型必须匹配答案 3 :(得分:0)
OUTPUT子句将帮助您获取新添加项目的ID。有关详细信息,请参阅以下链接:
点击here!更多细节