C#并行加表值参数 处理9万条数据

 使用场景:

    我们和第三方水表厂家合作,他们会传递9万条json 通过我们的接口 insert(update)我们的数据库表中。

    表值参数:存储过程中定义表的字段,类型(我理解为 临时表),C#  定义一样类型的DataTable,将json数据填充到DataTable,同时将DataTable  作为参数 传入到表值参数存储过程中。

    Parallel.ForEach:自动对数据进行分区。假如9万条数据,4核   分为17462条数据分别作为table传入到存储过程执行insert(update)

    这个我测试的时候,9万多条数据用时9分10秒,速度还有有点慢,我最后采用了另一种办法,在下一篇博客中写道。

     并行+表值参数主要代码     以下为C#主要代码

   

           表值参数  建表:

            

USE [MeterReadTest]
GO

/****** Object: UserDefinedTableType [dbo].[MRTableType] Script Date: 2018/6/20 15:58:48 ******/
CREATE TYPE [dbo].[MRTableType] AS TABLE(
[id] [int] NULL,
[freezedate] [varchar](20) NULL,
[dreaddate] [varchar](20) NULL,
[freezeMonth] [varchar](20) NULL,
[meter_sn] [varchar](20) NULL,
[meter_no] [varchar](20) NULL,
[flow] [decimal](18, 0) NULL,
[dayflow] [decimal](18, 0) NULL
)
GO

扫描二维码关注公众号,回复: 1700017 查看本文章

    

存储过程:

USE [MeterReadTest]
GO
/****** Object: StoredProcedure [dbo].[sp_test] Script Date: 2018/6/20 15:57:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


/* 创建一个存储过程以表值参数作为输入 */
ALTER Procedure [dbo].[sp_test](@dataTable MRTableType readonly)
as
declare @temp Table(
id int,
freezedate varchar(20),
dreaddate varchar(20),
meter_sn varchar(20),
meter_no varchar(20),
flow decimal,
dayflow decimal,
freezeMonth varchar(20)
);

--将表值参数赋值给@temp
insert into @temp(id,freezedate,dreaddate,freezeMonth,meter_sn,meter_no,flow,dayflow) select id,freezedate,dreaddate,freezeMonth,meter_sn,meter_no,flow,dayflow from @dataTable;

declare
@oldflow AS varchar(20),
@id AS int,
@imeterid As int,
@freezedate As varchar(20),
@dreaddate As varchar(20),
@meter_sn varchar(20),
@meter_no varchar(20),
@flow decimal,
@sql nvarchar(1000),
@dayflow decimal,
@time date,
@readtime datetime,
@tempMeterID int,
@freezeMonth varchar(20);

--第一种方案 C# 并行+存储过程(循环遍历)
--while exists(select @id from @temp)
--begin
--SET ROWCOUNT 1
----赋值
--select @freezedate=freezedate,@dreaddate=dreaddate,@meter_sn=meter_sn,@id=id, @meter_no=meter_no,@flow=flow from @temp;
--select @time=(CONVERT(varchar(100),@freezedate, 20));
--select @readtime=(CONVERT(varchar(100),@dreaddate, 20));
-- select @oldflow=0;
----计算日用量
--select @tempMeterID= iMeterID from WR_Meters where tMeterAddr= @meter_no and iMeterManufactureID='1'

--select top 1 @oldflow=fFreezeNumber from WR_FreezeDay where iMeterID=@tempMeterID
--and dFreezeDate <@time order by dFreezeDate desc;

--if exists(select iMeterID from [dbo].[WR_FreezeDay] where iMeterID=@tempMeterID and dFreezeDate=@freezedate)
-- update WR_FreezeDay set fFreezeNumber=@flow,fUseNumber=(@flow-@oldflow),dFactDate=GETDATE(),
-- dReadDate=@readtime where iMeterID=(select iMeterID from WR_Meters where
-- tMeterAddr=@meter_no and iMeterManufactureID='1' and dFreezeDate=@time);
--else
-- insert into WR_FreezeDay (iMeterID,dFreezeDate,fFreezeNumber,fUseNumber,dFactDate,dReadDate) values
-- (@tempMeterID,@time,@flow,(@flow-@oldflow),getdate(),@readtime);

--SET ROWCOUNT 0
--DELETE FROM @temp WHERE id=@id;
--end

猜你喜欢

转载自www.cnblogs.com/lwlr/p/9213245.html