2012-04-18 66 views
5

我有一個代碼如下,我試圖插入數據到表中並返回新元素的ID(由自動增量給出)。ExecuteScalar()返回null雖然數據已添加到數據庫

int newEquipmentID = new int(); 

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

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

但它失敗並返回null,就好像新項目還沒有添加。但實際上我可以看到這個新項目在DB上進行簡單的諮詢。

我的問題是「何時」將數據實際添加到數據庫中,以及如何獲取新添加的項目的ID。 謝謝!

回答

11

你不需要兩個查詢來創建新的記錄和檢索新的標識值:

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開始我不會使用這樣的數據庫類。

2

要返回,你需要選擇它剛插入行的ID,因爲ExecuteScalar()回報

的第一行的查詢返回的結果集的第一列

INSERT不選擇/返回任何東西。

insert ... 
select ... 

查看@ Tim的回答獲取更多詳情。

+0

...這就是爲什麼我使用的ExecuteScalar() – 2012-04-18 14:05:52

+0

的ExecuteScalar()返回元素(頂線左邊的列元素) – 2012-04-18 14:07:08

+0

@abatischchev的第一場,所以... – 2012-04-18 14:09:44

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>表示逗號分隔值列表t帽子將插入上述指定的字段中。值的數量應等於字段和數據類型的數量必須匹配
0

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

點擊here!更多的細節當然