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

c#调用存储过程实现批量增加和修改数据的更多相关文章

  1. mybatis 注解写法 多层嵌套foreach,调用存储过程,批量插入数据

    @Select("<script>" + "DECLARE @edi_Invoice_Details edi_Invoice_Details;" + ...

  2. Oracl 一条sql语句 批量添加、修改数据

    最近一直在用,也一直在学oralc,项目上也用到了批量的添加(读取上传CSV文件信息,把符合条件的信息写入到数据库中),在写的时候想到了可能是数据量大就想该怎么快,(由于本人在.NET开发期间没有做过 ...

  3. Java:批量插入、修改数据到数据库中的用法

    在java中使用JDBC实现批处理的对象一般是使用PrepareStatement对象. 如何使用: Class.forName("Oracle.jdbc.driver.OracleDriv ...

  4. ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql

    转: ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql 本文为博主原创,转载请注明出处. 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时 ...

  5. hibernate 批量增加 修改 删除

    4.2  Hibernate的批量处理 Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作.例如调用Session的delete ...

  6. ASP.NET MVC用存储过程批量添加修改数据

    用Entity Framework 进行数据库交互,在代码里直接用lamda表达式和linq对数据库操作,中间为程序员省去了数据库访问的代码时间,程序员直接可以专注业务逻辑层的编写.但是对于比较复杂的 ...

  7. sqlserver 批量删除存储过程和批量修改存储过程的语句

    sqlserver 批量删除存储过程和批量修改存储过程的语句- sqlserver 批量删除存储过程和批量修改存储过程的语句,需要的朋友可以参考下. - 修改: 复制代码 代码如下: declare ...

  8. Hibernate(十三)命名查询-批量处理和调用存储过程

    一.命名查询 HQL语句混杂在代码之间将破坏代码的可读性 Hibernate允许在映射配置文件中定义字符串形式的查询语句,这种查询方式称为命名查询 二.建立数据表和持久化类 建立数据表 create ...

  9. bat文件调用cmd命令批量提取文件夹中的文件名(批量修改文件扩展名)

    前言: 在平时的工作中,经常需要批量统计文件和数据,如果逐个统计的话太耗时,而且容易出错那么有没有什么快速的方法呢,这里给大家介绍一种简单高效的方法. 方法: 1.打开CMD命令: 按下 Ctrl+R ...

随机推荐

  1. AlarmManager(闹钟服务)

    1.Timer类与AlarmManager类区别: 对Timer就是定时器,一般写定时任务的时候 肯定离不开他,但是在Android里,他却有个短板,不太适合那些需要长时间在后台运行的 定时任务,因为 ...

  2. 关于一个GPGPU优化中Bank Conflict的讨论

    出自OpenGPU: 关于去除bank conflict的一个例子程序

  3. 关于在Vue中,只要单个列表显示模态框的做法。

    1.在后台返回的数组对象中,添加一个自定义属性,这个属性用于控制模态框的显示.2.在事件中传入该列表的索引参数,然后在事件方法中找到数组相对应的下标,更改自定义属性便可

  4. springboot之kafka安装与实践

    环境:腾讯云centos7 1.下载 http://mirror.bit.edu.cn/apache/kafka/2.3.0/kafka_2.11-2.3.0.tgz 2.解压 tar -xvf ka ...

  5. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_22-页面静态化-静态化测试-静态化程序测试

    测试service内些的静态化的方法 先新建一个测试类 模板的id 放到下拉的静态数据里面 这样这条数据 就是用用的轮播图005这个模板 把这条数据静态化 进入到断点里面.先获取数据模型 获取模板时 ...

  6. PowerDesigner设置code和name不联动的方法

    按照如下设置即可: 具体步骤:菜单:Tools--General Options--Name to Code mirroring的复选框不要选中.

  7. windows下gitee WEBHOOK的坑...

    折腾到凌晨五点,依然没有实现 windows下 分支  push之后服务器自动部署 主要是因为GIT的helper的配置上的问题.最后果断放弃了,最后祭出大招,用 WINDONS命令行自动循环..60 ...

  8. xhprof代码添加分析性能

    <?php xhprof_enable( XHPROF_FLAGS_MEMORY, [ 'ignored_functions' => [ //'call_user_func', //'ca ...

  9. 让SNIPER-MXNet从标准的COCO格式数据集中直接使用file_name作为图片路径

    告别项目中“依index生成路径”的方法,直接使用我们在生成.json标签时就已经写入的图片路径(这里我写入的是绝对路径 full path)来获取图片. 需要做的,用以下代码替换SNIPER/lib ...

  10. ArcMap 制作广州 18 级地图切片需要多少时间?

    制作地图切片包会随着级别的上升,瓦片数量会指数级地上升,所需的计算时间也是指数级的. 但是 ArcMap 并不会提示时间信息,只有一个圈没完没了地转... 就在这无聊地等待中,我写了这篇帖子. 电脑配 ...