gpt4 book ai didi

c# - 除了触发存储过程 368 次来更新数据库之外,还有什么好的替代方法?

转载 作者:太空狗 更新时间:2023-10-29 18:02:50 24 4
gpt4 key购买 nike

我正在开发一个 .NET 组件,该组件从数据库中获取一组数据,对该组数据执行一些业务逻辑,然后通过类似于 spUpdateOrderDetailDiscountedItem 的存储过程更新数据库中的单个记录。

对于小数据集,这不是问题,但是当我有一个非常大的数据集需要迭代 368 次存储过程调用来更新数据库中的记录时,我意识到我遇到了问题。一位高级开发人员查看了我的存储过程代码并说它看起来不错,但现在我想探索一种将“批量”数据发送到数据库的更好方法。

我有哪些选项可以批量更新数据库?这可能与存储过程有关吗?我还有哪些其他选择?

我无法选择安装功能完备的 ORM,但欢迎任何建议。


其他背景信息:

我们当前的数据访问模型是 5 年前构建的,目前对数据库的所有调用都是通过名称为 ExecQueryGetDataTable 的模块化/静态函数执行的。我不确定我是否需要留在那个模型中,但我必须提供一个很好的理由来离开我们当前的 DAL 以访问数据库。

另外值得注意的是,在 CRUD 操作和数据库方面,我还是个新手。我更喜欢在代码的 .NET 端玩/工作,但数据必须存储在某个地方,对吧?


存储过程内容:

ALTER PROCEDURE [dbo].[spUpdateOrderDetailDiscountedItem] 
-- Add the parameters for the stored procedure here
@OrderDetailID decimal = 0,
@Discount money = 0,
@ExtPrice money = 0,
@LineDiscountTypeID int = 0,
@OrdersID decimal = 0,
@QuantityDiscounted money = 0,
@UpdateOrderHeader int = 0,
@PromoCode varchar(6) = '',
@TotalDiscount money = 0

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
Update OrderDetail
Set Discount = @Discount, ExtPrice = @ExtPrice, LineDiscountTypeID = @LineDiscountTypeID, LineDiscountPercent = @QuantityDiscounted
From OrderDetail with (nolock)
Where OrderDetailID = @OrderDetailID

if @UpdateOrderHeader = -1
Begin
--This code should get code the last time this query is executed, but only then.
exec spUpdateOrdersHeaderForSkuGroupSourceCode @OrdersID, 7, 0, @PromoCode, @TotalDiscount
End

最佳答案

如果您使用的是 SQL 2008,那么您可以使用 table-valued parameter在一个 s'proc 调用中推送所有更新。

更新顺便说一句,我们将其与 merge 结合使用陈述。这样 sql server 就会负责确定我们是插入新记录还是更新现有记录。这种机制在我们的网络应用程序的几个主要位置使用,一次处理数百个更改。在正常加载期间,我们会看到这个过程每秒被调用大约 50 次,它比我们发现的任何其他方式都快得多……而且肯定比购买更大的数据库服务器便宜很多。

关于c# - 除了触发存储过程 368 次来更新数据库之外,还有什么好的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3282254/

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