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

标签 c# .net sql-server vb.net stored-procedures

我正在开发一个 .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/

相关文章:

c# - 将类型转换为通用类定义

sql-server - 无法在 Visual Studio 2012 或 2013 中打开 SSIS 项目(迁移失败)

c# - ASP.NET MVC3 : Set custom IServiceProvider in ValidationContext so validators can resolve services

c# - 使用 FIFO 同步运行任务的好方法?

c# - WPF:如何将大量大图像快速加载到包装面板中?

sql-server - 存储过程不喜欢 utf-16

sql - MSSQL : Disable triggers for one INSERT

c# - 在一个 Nuget 包中定位 .Net Core Framework 和完整的 .Net 4.5/4.6 Framework

c# - 为什么 C++ CLI 索引属性在 C# 中不起作用?

.net - 在 dotnet 核心中以不同的依赖版本结束