查看此处给出的示例:https : //stackoverflow.com/a/452934
我知道我将需要遍历循环并附加值子句,但是我缺少的是如何修改查询以返回新创建记录的所有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;
用这个:
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或更高版本时,此方法才有效。
编辑:正如Damien在评论中所说:“不能保证将更改应用于表的顺序与将行插入到输出表或表变量中的顺序是一致的。”
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句