gpt4 book ai didi

c# - 用于批量插入具有子对象的对象的性能

转载 作者:搜寻专家 更新时间:2023-10-30 22:14:02 24 4
gpt4 key购买 nike

我目前在这里挣扎。

环境:我正在使用 MSSQL Server 2008 R2 改进 C# 4.0 中的应用程序。我没有使用任何类型的 ORM。

设计/模型:(虚构)我有一个对话、一条消息和一个附件。对话有多条消息,每条消息可以有多个附件。那边很容易 1 .. N 连接。

问题:我想在我的数据库中存储一个新的对话,其中包含新的对话消息和新的附件。我现在的情况是,我通过保存对话来自上而下。检索该 id,将该 id 设置为消息对象并存储消息(每次我进行单独的数据库调用时)。对于所有附件,同样的故事,我需要先存储消息,然后才能存储这些附件。

我研究过或考虑过的解决方案

  • 目前我通过存储过程单独执行这些步骤,自上而下的保存机制。

  • SqlBulkCopy:真的很快。我曾想过,存储所有对话,取回 ID,存储所有消息,取回他们的 ID 等等......但问题就在这里,我需要做一个查询,比如“给我所有 20 个最后创建的记录他们的 ID”。可行,但事实上这个应用程序是多线程的,其他线程可能在那一刻插入新行或更糟,删除。

  • 创建存储过程,这是一个疯狂的存储过程,我在其中发送数据集对象(这是更自由的头脑 Storm 事件)。

  • 手动生成一个巨大的 sql 命令来存储对话,获取生成的 ID,并将其用于子对象。喜欢(伪SQL):

    插入对话

    currentConversationId = @Identity

    使用 conversationId = currentConversationId 插入消息

目标有人有更好的建议或替代方案吗?请避免建议我去 ORM,因为我正在处理遗留项目。我想尽可能地节省数据库调用。

最佳答案

使用表值参数发送多行以在一次调用中插入。您可以使用 OUTPUT INSERTED.ID 子句来检索创建的 ID。使用 MERGE 语句时,您不仅可以检索 ID,还可以从 TVP 检索原始值。这对于将 ID 与 TVP 行匹配很有用。这可能看起来像这样:

OUTPUT @tvp.SomeID, INSERTED.ID

关于c# - 用于批量插入具有子对象的对象的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17641182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com