gpt4 book ai didi

c# - 可以在 SQLBulkCopy 之后取回主键 ID 吗?

转载 作者:IT王子 更新时间:2023-10-29 04:43:50 26 4
gpt4 key购买 nike

我正在使用 C# 并使用 SqlBulkCopy。我有一个问题。我需要在一个表中进行批量插入,然后在另一个表中进行批量插入。

这2个有PK/FK关系。

Table A
Field1 -PK auto incrementing (easy to do SqlBulkCopy as straight forward)

Table B
Field1 -PK/FK - This field makes the relationship and is also the PK of this table. It is not auto incrementing and needs to have the same id as to the row in Table A.

因此这些表具有一对一的关系,但我不确定如何取回批量插入生成的所有那些 PK Id,因为我需要它们用于表 B。

编辑

我可以做这样的事情吗?

SELECT * 
FROM Product
WHERE NOT EXISTS (SELECT * FROM ProductReview WHERE Product.ProductId = ProductReview.ProductId AND Product.Qty = NULL AND Product.ProductName != 'Ipad')

这应该会找到刚刚使用 sql 批量复制插入的所有行。我不确定如何从中获取结果然后从 SP 中对它们进行大量插入。

我能看到的唯一问题是,如果用户一次只记录一条记录,而这条语句同时运行,它可能会尝试在“产品评论表”中插入一行两次。

假设我有一个用户使用手动方式,而另一个用户几乎同时使用大量方式。

手动方式。1.用户提交数据2. Linq to sql Product 对象被创建并填充数据并提交。3. 这个对象现在包含 ProductId4. 为 Product review 表创建另一个 linq to sql 对象并插入(发送步骤 3 中的 Product Id)。

大众路。1. 用户从共享数据的用户那里获取数据。2. 抓取共享用户的所有产品行。3. 在产品行上发生 SQL 批量复制插入。4.我的SP选择了所有只存在于Product表中并且满足一些其他条件的行5. 大量插入发生在这些行上。

如果第 3 步(手动方式)与第 4 步(大众方式)同时发生,会发生什么情况。我认为它会尝试插入同一行两次,从而导致主约束执行。

最佳答案

在那种情况下,我会使用 SqlBulkCopy 插入一个staging 表(即看起来像我要导入的数据,但不是主事务表),然后在数据库中使用 INSERT/SELECT 将数据移动到第一个实际表中。

现在我有两种选择,具体取决于服务器版本;我可以对第二个真实表执行第二个 INSERT/SELECT,或者我可以使用 INSERT/OUTPUT使用表中的标识行执行第二个插入的子句。

例如:

     -- dummy schema
CREATE TABLE TMP (data varchar(max))
CREATE TABLE [Table1] (id int not null identity(1,1), data varchar(max))
CREATE TABLE [Table2] (id int not null identity(1,1), id1 int not null, data varchar(max))

-- imagine this is the SqlBulkCopy
INSERT TMP VALUES('abc')
INSERT TMP VALUES('def')
INSERT TMP VALUES('ghi')

-- now push into the real tables
INSERT [Table1]
OUTPUT INSERTED.id, INSERTED.data INTO [Table2](id1,data)
SELECT data FROM TMP

关于c# - 可以在 SQLBulkCopy 之后取回主键 ID 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2945414/

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