2015-07-21 34 views
3

看着此處給出的示例: https://stackoverflow.com/a/452934插入多行到MS SQL Server和檢索的所有新表的ID後面

我明白,我需要通過一個循環來遍歷和附加價值的條款,但我我缺少的是如何修改查詢返回新創建的記錄的所有ID,並在C#中檢索它們?

比如我當前的代碼可以在下面看到,我想改變它在一個查詢中插入多行和檢索新創建的Id佔盡整數列表。

in_new_id = -1; 
String query = "INSERT INTO " + DB_Base.DBTable_Customer_Order_Table + "(" + DB_Base.DBTable_Customer_Order_Table_Customer_ID + "," + DB_Base.DBTable_Customer_Order_Table_ProductId+")"; 
query += " OUTPUT INSERTED." + DB_Base.DBTable_Customer_Order_Table_ID; 
query += " VALUES (@customerId, @productId);"; 

using (SqlConnection conn = new SqlConnection(GeneralConfig.DB_STR())) 
{ 
    SqlCommand sql_command = new SqlCommand(query, conn); 
    sql_command.Parameters.AddWithValue("@customerId", data_obj.customerId); 
    sql_command.Parameters.AddWithValue("@productId", data_obj.productId); 
    if (!String.IsNullOrEmpty(query) && sql_command != null && conn != null) 
    { 
     sql_command.Connection.Open(); 
     if (sql_command.Connection.State == System.Data.ConnectionState.Open) 
     { 
      object out_new_id = sql_command.ExecuteScalar(); 
      if (out_new_id != null) 
      { 
       in_new_id = (int)out_new_id; 
      } 
      sql_command.Connection.Close(); 
      return ENUM_DB_Status.DB_SUCCESS; 
     } 
     else 
     { 
      in_new_id = -1; 
      return ENUM_DB_Status.DB_CONNECTION_COULD_NOT_OPEN; 
     } 
    } 
} 

return ENUM_DB_Status.DB_FAIL; 
+0

使用輸出子句,以獲得多個ID到另一個表。然後從新表中檢索所有數據。這可以在沒有循環的批處理中完成 – ashim

+1

請注意,整數列表可能很容易檢索,但不能保證(我知道)例如在列表中的第一個值將對應於第一行'VALUES'子句中,第二,第二等 –

+0

@AshimDas你有如何做到這一點的例子,我無法找到多行插入僅爲例單個插入 - >輸出ID。 – Dizzle

回答

1

使用此:

List<int> ids = new List<int>(); 
using (SqlCommand command = new SqlCommand(@"declare @T TABLE(Id int) 
                   INSERT INTO YourTableName(YourTableColumnNames) 
                   OUTPUT Inserted.Id into @T VALUES 
                   (YourValues1), 
                   (YourValues2), 
                   (YourValues3), 
                   (etc...) select Id from @T ", con)) 
        { 
         using (SqlDataReader reader = command.ExecuteReader()) 
         { 
          while (reader.Read()) 
          { 
           int id = int.Parse(reader[0].ToString()); 
           ids.Add(id); 
          } 
         } 
        } 

警告!只有在使用SQLServer 2008 R2或更高版本時才能使用。
編輯:作爲達明在評論說:「沒有保證的順序的變化被施加到表和其中的行被插入到輸出表或表變量將對應的順序」

+0

即使** **如果由輸出子句返回行的順序是保證(我不知道它是,在對問題的評論表示),*任何*訂貨擔保已最終失去了'選擇來自@ T'查詢的ID,因爲它沒有指定'ORDER BY'子句。 –

+0

@Damien_The_Unbeliever同意。從我測試過的東西(試圖在表格中插入5行)中,ids返回的順序(可能是巧合)' – Zippy

+1

事實上,我們甚至有[OUTPUT子句](https://msdn.microsoft.com/zh-cn/ COM/EN-US /庫/ ms177564.aspx):「有不能保證的順序的變化被施加到表和其中的行被插入到輸出表或表變量將對應的順序」 –

相關問題