c#调用存储过程实现批量增加和修改数据

本文介绍了一种通过构建数据包并利用存储过程实现数据库批量更新的方法。该方法首先将待更新的数据构建为DataTable,再将其转换为XML字符串传递给存储过程。存储过程内部使用MERGE语句来判断数据是否存在,存在则更新,不存在则插入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 例如当我在编辑表格数据,一次编辑了多行需要保存到数据库时,就需要判断数据库中是否已经存在,存在则修改,不存在则新增一条或多条数据,即所谓批量增加或者跟新数据。

    首先需要构建数据包,把要添加或者跟新的数据构建成一个datatable,例如我数据库中的表结构是这样

   

CREATE TABLE [dbo].[FlagDescription]
(
[FundId] [CHAR(10)] not null,
[SurveyType] [tinyint] not null,
[DefectReason] TINYINT null,
[Flag] TINYINT null,
[LastUpdate] smalldatetime null,
[UserId] [INT] NULL
CONSTRAINT [PK_FlagDescription] PRIMARY KEY CLUSTERED
(
[FundId] ASC,
[SurveyType] ASC
)ON [PortfolioCoreData_Data]
)ON [PortfolioCoreData_Data]

GO

 

我先要构建一个datatable,将表格中变动的每一行数据添加到这个datatable中

private static DataTable BuildDatatable()
{
DataTable dtFlag = new DataTable();
if (!dtFlag.Columns.Contains("FundId"))
{
dtFlag.Columns.Add("FundId", typeof(string));
}

if (!dtFlag.Columns.Contains("SurveyType"))
{
dtFlag.Columns.Add("SurveyType", typeof(int));
}

if (!dtFlag.Columns.Contains("Flag"))
{
dtFlag.Columns.Add("Flag", typeof(int));
}

if (!dtFlag.Columns.Contains("DefectReason"))
{
dtFlag.Columns.Add("DefectReason", typeof(int));
}

if (!dtFlag.Columns.Contains("UserId"))
{
dtFlag.Columns.Add("UserId", typeof(int));
}

return dtFlag;
}

然后将datatable转换为xml字符串,并将它作为存储过程的参数传递给存储过程,代码如下:

public static void AddFlagDescription(DataTable dt)
{

string storedProcedure = string.Empty;
storedProcedure = "dbo.addFlagDescriptions";
using (SqlConnection conn = SQLUtility.GetConnection("AcquisitionData", "Editor", -1))
{
SqlCommand cmd = SQLUtility.InitStoredProcedure(storedProcedure, conn);
cmd.Parameters["@p_Xml"].Value = ConvertDataTableToXML(dt);
cmd.ExecuteNonQuery();
}
}

public static string ConvertDataTableToXML(DataTable dtKeys)
{
dtKeys.TableName = "Key";
System.IO.StringWriter tw = new System.IO.StringWriter();
dtKeys.WriteXml(tw);
return tw.ToString();
}

 

最后编写存储过程完成批量增加和跟新的功能:

USE [AcquisitionData]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[addFlagDescriptions]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[addFlagDescriptions]
GO
CREATE PROCEDURE dbo.addFlagDescriptions
@p_Xml XML
AS
SET NOCOUNT ON

BEGIN

;WITH b AS
(
SELECT
QueryExpression.Criteria.value('FundId[1]', 'CHAR(10)') AS FundId,
QueryExpression.Criteria.value('SurveyType[1]', 'TINYINT') AS SurveyType,
QueryExpression.Criteria.value('Flag[1]', 'TINYINT') AS Flag,
QueryExpression.Criteria.value('DefectReason[1]', 'TINYINT') AS DefectReason,
QueryExpression.Criteria.value('UserId[1]', 'INT') AS UserId
FROM @p_Xml.nodes('/DocumentElement/Key') QueryExpression(Criteria)
)

-- Update
MERGE INTO AcquisitionData.dbo.FlagDescription a
USING b ON a.FundId=b.FundId and a.SurveyType=b.SurveyType
WHEN MATCHED THEN
UPDATE
SET a.FundId=b.FundId,
a.SurveyType=b.SurveyType,
a.Flag=b.Flag,
a.DefectReason=b.DefectReason,
a.UserId=b.UserId
--INSERT
WHEN NOT MATCHED THEN
INSERT(FundId,
SurveyType,
DefectReason,
Flag,
UserId,
LastUpdate)
VALUES(b.FundId,
b.SurveyType,
b.DefectReason,
b.Flag,
b.UserId,
GETDATE()
);

END

RETURN @@ERROR

GO
GRANT EXECUTE ON [dbo].[addFlagDescriptions] TO [rl_DataUpload]
GO

 

转载于:https://www.cnblogs.com/mibing/p/5853302.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值