c# - 如何使用单个查询插入许多子/父项
问题描述
假设我们有以下 SQL Server 表结构:
MainItem
........
ID (int)
Total (money)
SubItem
........
ID (int)
MainItemID (int)
Price (money)
我们需要生成数千个 MainItem,每个 MainItem 有几十个 SubItem,并一次将其输入数据库。目前我们的代码看起来像这样:
Dictionary<int, int> oldToNewIDs = new Dictionary<int, int>();
foreach(MainItem mainItem in GeneratedMainItems)
{
int oldID = mainItem.ID;
mainItem.Update();
oldToNewIDs.Add(oldID, mainItem.ID);
}
foreach (SubItem subItem in GeneratedSubItems)
{
fi.MainItemID = oldToNewIDs[fi.MainItemID];
subItemsToInsert.Add(fi);
}
InsertAllSubItemsAtOnce(subItemsToInsert);
一次插入所有子项的代码如下所示:
string sql = @"
INSERT INTO SubItems (MainItemID, Price) VALUES (1, 100)
INSERT INTO SubItems (MainItemID, Price) VALUES (1, 50)
INSERT INTO SubItems (MainItemID, Price) VALUES (2, 20)
...
";
UpdateDB(sql);
我们目前面临的问题是,有一次,只插入了一半的子项。所以我们最终得到了错误的总数和子项。我不完全明白这是怎么发生的,但我猜是 sql server 出了点问题?
我们想要实现的是,我们一次插入所有内容(主项和子项),如果出现问题,插入将被中止,因此我们不会得到无效数据。如何才能做到这一点?
解决方案
将您的工作量放入事务中
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(sql , conn, conn.BeginTransaction());
try
{
cmd.ExecuteNonQuery();
cmd.Transaction.Commit();
}
catch(System.Exception ex)
{
cmd.Transaction.Rollback();
throw ex;
}
conn.Close();
}
推荐阅读
- java - 在springboot中带有胡子模板问题的swagger codegen maven插件
- wix - 从托管引导程序代码中触发降级应用程序的卸载
- python - Python - 如何重新排列数组中的数据?
- python - 如何让不和谐的机器人给某人一个角色
- wordpress - 如何在 Woocommerce 附加信息产品选项卡中显示变体属性的默认设置?
- node.js - 从 api 网关和 dynamoDb 获取错误响应 = null
- arrays - 如何删除所有子数组
- r - 计算变量之间所有可能的产品组合
- basex - 查询 .evtx 转换为 .xml
- amazon-web-services - WS - 从 worker_groups 获取实例 ID