![](/img/trans.png)
[英]ExecuteScalar() always returns NULL even though there is data in the database
[英]ExecuteScalar() returns null altough data was added to DB
我有一個代碼如下所示,我嘗試將數據插入表中並返回新元素的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。 謝謝!
您不需要兩個查詢來創建新記錄並檢索新的標識值:
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();
}
}
Side-Note:我不會使用這樣的Database-Class,因為它容易出錯 。
要返回剛插入的行的id,您需要選擇它,因為ExecuteScalar()
返回
查詢返回的結果集中第一行的第一列
和INSERT
不選擇/返回任何內容。
insert ...
select ...
有關更多詳細信息,請參閱@Tim的答案。
您的SQL查詢不會返回新生成的Id。 要返回它,請使用OUTPUT
子句 :
INSERT INTO Equipment (<list of fields>)
OUTPUT inserted.EquipmentTypeID
VALUES (<list of values>)
有些事情需要注意:
<list of fields>
表示要為其提供值的以逗號分隔的列列表 <list of values>
表示將插入上述指定字段中的逗號分隔值列表。 值的數量應等於字段數,數據類型必須匹配 OUTPUT子句將幫助您獲取新添加項目的ID。 有關更多信息,請參閱以下鏈接:
點擊這里 ! 了解更多細節
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.