2015-07-21 46 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):“有不能保证的顺序的变化被施加到表和其中的行被插入到输出表或表变量将对应的顺序” –