Fastest way of performing Bulk Update in C# / .NET

前端 未结 3 923
面向向阳花
面向向阳花 2021-02-11 07:55

I\'m trying to figure out whats the best possible way to perform a bulk update via my mini console application in SQL server. I have written my own way of bulk update like follo

相关标签:
3条回答
  • 2021-02-11 08:14

    The fastest way would be to bulk insert the data into temporary table using the built in SqlBulkCopy Class, and then update using join to that table

    Or you can use a tool such as SqlBulkTools which does exactly this in an easy way.

    var bulk = new BulkOperations();
    
    using (TransactionScope trans = new TransactionScope())
    {
        using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=mydb;Integrated Security=SSPI")
        {
            bulk.Setup()
                .ForCollection(items)
                .WithTable("Items")
                .AddColumn(x => x.QuantitySold)
                .BulkUpdate()
                .MatchTargetOn(x => x.ItemID) 
                .Commit(conn);
        }
    
        trans.Complete();
    }
    
    0 讨论(0)
  • 2021-02-11 08:16

    You can use Kros.KORM for bulk operation.

    using (var database = new Database("connectionstring ...", "ado client name ..."))
    {
        database
           .Query<Movie>()
           .AsDbSet()
           .BulkUpdate(_data);
    }
    

    Or if you do not need to use ORM and have the source data reader available, you can use the SqlServerBulkInsert / SqlServerBulkUpdate or MsAccessBulkInsert / MsAccessBulkUpdate classes to perform bulk operations.

    For example:

    using (var bulkInsert = new SqlServerBulkInsert("connection string"))
    {
        bulkInsert.Insert(reader);
    }
    

    You can see comparison with pure ADO.NET commands https://github.com/Kros-sk/Kros.Libs/wiki

    0 讨论(0)
  • 2021-02-11 08:34

    I don't know what items is in your code so I don't know how to get the items into a table valued parameter. I can help with that if you need it but I would need to know what that object is.

    Regardless you could do something like this on the sql side. Then you simply execute this procedure with your items collection as inbound parameter.

    create type Items as TABLE
    (
        ItemID int
        , Quantity int
    )
    
    GO
    
    create procedure UpdateItemsBulk
    (
        @Items Items READONLY
    ) as
    
        set nocount on;
    
        Update i
        set QuantitySold = items.Quantity
        from items i
        join @Items items on items.ItemID = i.ItemID
    
    GO
    
    0 讨论(0)
提交回复
热议问题