簡體   English   中英

ExecuteScalar()返回null,盡管數據已添加到DB

[英]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>表示要為其提供值的以逗號分隔的列列表
  • 字段列表不應包含自動增量ID列(將自動分配值)
  • <list of values>表示將插入上述指定字段中的逗號分隔值列表。 值的數量應等於字段數,數據類型必須匹配

OUTPUT子句將幫助您獲取新添加項目的ID。 有關更多信息,請參閱以下鏈接:

點擊這里 了解更多細節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM