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

     private string GUID;//序号GUID唯一标识
private string filename;//文件名称
private string lmportl_ID;//导入ID
private Int32? lmportl_date;//导入时间
private string diflag;// 国际/国内标识 DIFlag

上传CSV文件有专门的方法,只要复制进去就好了

  

   #region 将CSV文件的数据读取到DataTable中
/// <summary>
/// 将CSV文件的数据读取到DataTable中
/// </summary>
/// <param name="fileName">CSV文件路径</param>
/// <returns>返回读取了CSV数据的DataTable</returns>
public static DataTable OpenCSV(string filePath)
{
DataTable dt = new DataTable();
FileStream fs = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); StreamReader sr = new StreamReader(fs, Encoding.UTF8);
//StreamReader sr = new StreamReader(fs, encoding);
//string fileContent = sr.ReadToEnd();
//记录每次读取的一行记录
string strLine = "";
//记录每行记录中的各字段内容
string[] aryLine = null;
string[] tableHead = null;
//标示列数
int columnCount = ;
//标示是否是读取的第一行
bool IsFirst = true;
//逐行读取CSV中的数据
while ((strLine = sr.ReadLine()) != null)
{ if (IsFirst == true)
{
tableHead = strLine.Split(','); if (tableHead.Length > )
//截取列数
tableHead = tableHead.Skip().Take().ToArray();
IsFirst = false;
columnCount = tableHead.Length; //创建列
for (int i = ; i < columnCount; i++)
{
tableHead[i] = tableHead[i].Replace("\"", "");
DataColumn dc = new DataColumn(tableHead[i]);
dt.Columns.Add(dc);
}
}
else
{
aryLine = strLine.Split(',');
if (aryLine.Length > )
aryLine = aryLine.Skip().Take().ToArray();
DataRow dr = dt.NewRow();
//是否超过1000行
if (dt.Rows.Count <= )
{
//Prefix和FormType字符串长度是否超过3
if (aryLine[].Length <= && aryLine[].Length <= )
{
dr[] = aryLine[].Replace("\"", "");
dr[] = aryLine[].Replace("\"", "");
}
else
{
dr[] = aryLine[].Substring(, );
dr[] = aryLine[].Substring(, );
}
//TicketNo 字符串长度是否超过8
if (aryLine[].Length <= )
{
dr[] = aryLine[].Replace("\"", "");
}
else
{
dr[] = aryLine[].Substring(, );
}
}
else
{
return dt;//跳出程序,行数大于1000,不做添加,
}
dt.Rows.Add(dr);
}
}
if (aryLine != null && aryLine.Length > )
{
dt.DefaultView.Sort = tableHead[];
}
sr.Close();
fs.Close();
return dt;
}
#endregion

上传完成的CSV文件返回的DataTable  我需要把DataTable 转货成List,我们用的EF所以可以直接转换

  DataEnt = DataConvertor.GetEntityList<t>(dtb) as List<T>;

把List传入方法中

   #region 插入票号转换数据到表
/// <summary>
/// 插入票号转换数据到表
/// </summary>
/// <param name="">表的实体</param>
/// <returns></returns>
public BaseEntityJsonObject<int> Insert_TRANSFER(List<T> T)
{ BaseEntityJsonObject<int> result = new BaseEntityJsonObject<int>();
int count = ;
string strSql = "";
try
{
StringBuilder strBuilder = new StringBuilder(); strBuilder.Append("INSERT INTO 表名( 字段明,字段明,字段明) ");
strBuilder.Append("select sequence_name.nextval ,t.c1,t.c2,t.c3,t.c4,t.c5 FROM ( ");
foreach (var item in T)
{
strBuilder.Append(" SELECT ");
strBuilder.Append("'" + item.字段名+ " 'C1,'" + item.字段名+ " 'C2,'" + item.字段名+ "' C3,");
strBuilder.Append("'字段名' C4 ,'" + 字段名+ "' C5 FROM DUAL union all ");
}
strBuilder.Append(" ) T");
strSql = string.Format(strBuilder.ToString());
int i = ;
//sql写完后这里嘚坐sql的截取,要不然会报错
strSql = strSql.Remove(strSql.Length - i, ); count = DbContext.Database.ExecuteSqlCommand(strSql); }
catch (Exception ex)
{
ExceptionHandler.HandleException(ex); }
return result;
}
#endregion

这就是添加!

下面写批量修改

写修改前先要把要修稿的数据查询出来,转货成LIst,我就不说怎么查询,怎么转货List了

我这里写的流程是先把List写进数据库的视图中,然后数据插进伪表中 然后根据伪表中的数据做进一步的条件,不说了,直接上代码

        #region 修改转换数据到表
/// <summary>
/// 修改转换数据到表
/// </summary>
/// <param name="">表的实体</param>
/// <returns></returns>
public BaseEntityJsonObject<int> Update_TRANSFER(List<T> T)
{
BaseEntityJsonObject<int> result = new BaseEntityJsonObject<int>();
int count = ;
string strSql = "";
try
{
StringBuilder strBuilder = new StringBuilder();
strBuilder.Append(" MERGE INTO TRT_TICKETNUMBER_TRANSFER T1 USING ( ");
//从这里循环要修改的数据,把数据先临时放到伪表中
foreach (var item in t)
{
strBuilder.Append(" SELECT '" + item.要修改的字段名+ "' a, '" + item.要修改的字段名+ "' b FROM DUAL t ");
strBuilder.Append(" union all ");
}
string str2 = strBuilder.ToString();
if (str2 != "")
{
str2 = str2.Remove(str2.Length - );
}
//把sql进行截取,要不然会报错,然后在拼接SQL语句 StringBuilder strBuilder2 = new StringBuilder();
strBuilder2.Append(" ) T2 ON ( T1.表中的主键字段 = T2.a 临时表的字段 ) ");
strBuilder2.Append(" WHEN MATCHED THEN ");
strBuilder2.Append(" UPDATE SET T1.需要修改的字段名 = t2.b"); strSql = str2 + strBuilder2.ToString();
count = DbContext.Database.ExecuteSqlCommand(strSql);
result.payload = count;
result.errorCode = ;
}
catch (Exception ex)
{
ExceptionHandler.HandleException(ex); LogHelper.Error(string.Format("添加表数据失败"), ex);
}
return result;
}
#endregion

这样就完成了数据的修改,

由于临时想起来写博客,没有准备充分,

有什么不妥的欢迎大家指出,欢迎大家吧问题指出来,然后大家共同进步

Oracl 一条sql语句 批量添加、修改数据的更多相关文章

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

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

  2. .net Sql语句批量插入数据库数据

    #region 使用SqlBulkCopy public static bool ExecuteTransactionScopeInsert(DataTable dt, int batchSize) ...

  3. JavaWeb 学习009-4个页面,5条sql语句(添加、查看、修改、删除)

    ===========++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++==+++++++++ 2016-12-3------ ...

  4. JavaWeb 学习007-4个页面,5条sql语句(添加、查看、修改、删除)2016-12-2

    需要复习的知识: 关联查询 =================================================================================班级模块学 ...

  5. SQL语句的添加、删除、修改多种方法

    SQL语句的添加.删除.修改虽然有如下很多种方法,但在使用过程中还是不够用,不知是否有高手把更多灵活的使用方法贡献出来? 添加.删除.修改使用db.Execute(Sql)命令执行操作╔------- ...

  6. 转 SQL语句的添加、删除、修改多种方法

    SQL语句的添加.删除.修改虽然有如下很多种方法,但在使用过程中还是不够用,不知是否有高手把更多灵活的使用方法贡献出来? 添加.删除.修改使用db.Execute(Sql)命令执行操作 ╔------ ...

  7. Mysql 一条SQL语句实现批量更新数据,update结合case、when和then的使用案例

    如何用一条sql语句实现批量更新?mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现. 复制代码 代码如下: UPDATE mytable SET myfield = CASE i ...

  8. (七)修改上一条SQL语句,NULL值的滤空函数nvl

    修改上一条SQL语句 1.用c命令来修改(c 即 change ) 默认,光标闪烁位置指向上一条SQL语句的第一行.输入二则定位到第二行. c /错误的关键字/正确的关键字 SQL form emp; ...

  9. java执行多条SQL语句

    一次执行多条SQL的技术要点如下: DatabaseMetaData接口是描述有关数据库的整体综合信息,由于DatabaseMetaData是接口,所以没有构造方法,故不能使用new来创建Databa ...

随机推荐

  1. headfirst设计模式(8)—适配器模式与外观模式

    前言 这一章主要讲2个模式,一个是,适配器模式(负责将一个类的接口适配成用户所期待的),另外一个是外观模式(为子系统提供一个共同的对外接口),看完的第一反应是,为什么要把它们两放在同一章,难道它们有什 ...

  2. Angular(01)-- 架构概览

    声明 本系列文章内容梳理自以下来源: Angular 官方中文版教程 官方的教程,其实已经很详细且易懂,这里再次梳理的目的在于复习和巩固相关知识点,刚开始接触学习 Angular 的还是建议以官网为主 ...

  3. 华为模拟器eNSP安装(最新)网络工程师必备!

    电脑杂七杂八的东西太多了,于是今天把电脑重装系统了,正好重新安装一下华为模拟器eNSP,这个教程应该是最新的,因为eNSP版本更新以及华为官网页面的变化,有的小伙伴安装eNSP都下载不到安装包,接下来 ...

  4. Mac OS X中开启或关闭显示隐藏文件命令

    前言:之前一直用的都是 windows 系统的电脑,刚接触 Mac ,很多功能都不熟悉,写下博客记录一下,以防以后忘记,也给后来者提供方便. 命令行方式:显示隐藏文件: defaults write ...

  5. Android studio简单布局之view基本属性

    本人属于自学上路,目前是在入门阶段,所以有些内容实质性比较少,请各位大佬多多包涵. 视图view的基本属性: layout_margin:定义视图与周围视图之间的空白距离 layout_padding ...

  6. netdom remove 错误:netdom remove

    自己用错了命令,直接将加入域的计算机使用dsrm删除了,本来应该使用netdom remove的,结果在域控制器上使用netdom remove错误,在客户端上登录时一样提示:netdom remov ...

  7. Ansible安装及简单使用备注

    1.安装epel源: rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm 2.安装: yum ...

  8. MySQL 多表查询 学习与练习

    一.介绍 首先先准备表 员工表和部门表 #建表 create table department( id int, name varchar(20) ); create table employee1( ...

  9. 吴恩达机器学习笔记59-向量化:低秩矩阵分解与均值归一化(Vectorization: Low Rank Matrix Factorization & Mean Normalization)

    一.向量化:低秩矩阵分解 之前我们介绍了协同过滤算法,本节介绍该算法的向量化实现,以及说说有关该算法可以做的其他事情. 举例:1.当给出一件产品时,你能否找到与之相关的其它产品.2.一位用户最近看上一 ...

  10. asp.net core导入excel

    接昨天的导出 导入excel内容 对比昨天导出的内容增加了一行实体属性名称作为标题行,这样到转换为实体的时候才能找到对应的属性. 导入代码 public IActionResult InportExc ...