c#调用存储过程实现批量增加和修改数据
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#调用存储过程实现批量增加和修改数据的更多相关文章
- mybatis 注解写法 多层嵌套foreach,调用存储过程,批量插入数据
@Select("<script>" + "DECLARE @edi_Invoice_Details edi_Invoice_Details;" + ...
- Oracl 一条sql语句 批量添加、修改数据
最近一直在用,也一直在学oralc,项目上也用到了批量的添加(读取上传CSV文件信息,把符合条件的信息写入到数据库中),在写的时候想到了可能是数据量大就想该怎么快,(由于本人在.NET开发期间没有做过 ...
- Java:批量插入、修改数据到数据库中的用法
在java中使用JDBC实现批处理的对象一般是使用PrepareStatement对象. 如何使用: Class.forName("Oracle.jdbc.driver.OracleDriv ...
- ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql
转: ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql 本文为博主原创,转载请注明出处. 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时 ...
- hibernate 批量增加 修改 删除
4.2 Hibernate的批量处理 Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作.例如调用Session的delete ...
- ASP.NET MVC用存储过程批量添加修改数据
用Entity Framework 进行数据库交互,在代码里直接用lamda表达式和linq对数据库操作,中间为程序员省去了数据库访问的代码时间,程序员直接可以专注业务逻辑层的编写.但是对于比较复杂的 ...
- sqlserver 批量删除存储过程和批量修改存储过程的语句
sqlserver 批量删除存储过程和批量修改存储过程的语句- sqlserver 批量删除存储过程和批量修改存储过程的语句,需要的朋友可以参考下. - 修改: 复制代码 代码如下: declare ...
- Hibernate(十三)命名查询-批量处理和调用存储过程
一.命名查询 HQL语句混杂在代码之间将破坏代码的可读性 Hibernate允许在映射配置文件中定义字符串形式的查询语句,这种查询方式称为命名查询 二.建立数据表和持久化类 建立数据表 create ...
- bat文件调用cmd命令批量提取文件夹中的文件名(批量修改文件扩展名)
前言: 在平时的工作中,经常需要批量统计文件和数据,如果逐个统计的话太耗时,而且容易出错那么有没有什么快速的方法呢,这里给大家介绍一种简单高效的方法. 方法: 1.打开CMD命令: 按下 Ctrl+R ...
随机推荐
- 001-多线程-JUC线程池-线程池架构-Executor、ExecutorService、ThreadPoolExecutor、Executors
一.概述 1.1.线程池架构图 1. Executor 它是"执行者"接口,它是来执行任务的.准确的说,Executor提供了execute()接口来执行已提交的 Runnable ...
- JavaScript new对象的四个过程
new 一个对象 function Person(name, age) { this.name = name; this.age = age; } var person = new Person(&q ...
- Spring事务管理4-----声明式事务管理(2)
声明式事务管理 基于AspectJ的 XML 方式配置 通过对事务管理器TransactionManager配置通知(增强),然后再配置切点和切面,详细见applicationContext.xml ...
- Java工程师学习指南第1部分:夯实Java基础系列
点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 本文整理了微信公众号[Java技术江湖]发表和转载过的Java优质文章,想看到更多 ...
- “但行好事 莫问前程 只问耕耘 不问收获 成功不必在我 而功力必不唐捐” 科技袁人·年终盛典——5G是科技时代非常重要的基础设施
中国的科技实力:用数据对比展示当前中国整体科技实力在国际中的发展水平和未来的发展趋势. 主要分为基础研究和应用研究.其中基础研究通过论文数据进行对比展示,应用研究通过发明专利数据. 又分别结合当今中国 ...
- lua程序设计 第一章习题答案
练习1.1:运行阶乘的示例并观察,如果输入负数,程序会出现什么问题?试着修改代码来解决问题. 答:当输入负数时,循环无法终止,因为原本程序中的终止条件为n==0,而在输入为负数情况下,无法达成此终止条 ...
- Guava源码阅读-base-Enums
package com.google.common.base; guava源码中对这个类的方法介绍只有一句话: Utility methods for working with {@link Enum ...
- STM32 MCU一次计算优化和提速
1.背景 STM32 MCU对25.6Kb数据进行压缩,丢掉每个数据的低4位然后2个字节拼接为1个字节.发现处理耗时竞达1ms以上,于是开始进行优化,最后达到200us的效果,提速5倍以上. 2.优化 ...
- 数字麦克风PDM信号采集与STM32 I2S接口应用--笔记目录
数字麦克风采用MEMS技术,将声波信号转换为数字采样信号,由单芯片实现采样量化编码,一般而言数字麦克风的输出有PDM麦克风和PCM麦克风,由于PDM麦克风结构.工艺简单而大量应用,在使用中要注意这二者 ...
- zTree入门使用
简单入门使用,熟悉其功能,没有与异步调用后台数据,用的是本地设置的数据. zTree的API:http://www.treejs.cn/v3/api.php 源码:https://github.com ...