zoukankan      html  css  js  c++  java
  • Oracl 一条sql语句 批量添加、修改数据

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

    1     private string GUID;//序号GUID唯一标识
    2         private string filename;//文件名称
    3         private string lmportl_ID;//导入ID
    4         private Int32? lmportl_date;//导入时间
    5         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 = 0;
                //标示是否是读取的第一行
                bool IsFirst = true;
                //逐行读取CSV中的数据
                while ((strLine = sr.ReadLine()) != null)
                {
    
                    if (IsFirst == true)
                    {
                        tableHead = strLine.Split(',');
    
                        if (tableHead.Length > 3)
                            //截取列数
                            tableHead = tableHead.Skip(0).Take(3).ToArray();
                        IsFirst = false;
                        columnCount = tableHead.Length;
    
                        //创建列
                        for (int i = 0; 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 > 3)
                            aryLine = aryLine.Skip(0).Take(3).ToArray();
                        DataRow dr = dt.NewRow();
                        //是否超过1000行
                        if (dt.Rows.Count <= 1000)
                        {
                            //Prefix和FormType字符串长度是否超过3
                            if (aryLine[0].Length <= 3 && aryLine[1].Length <= 3)
                            {
                                dr[0] = aryLine[0].Replace(""", "");
                                dr[1] = aryLine[1].Replace(""", "");
                            }
                            else
                            {
                                dr[0] = aryLine[0].Substring(0, 3);
                                dr[1] = aryLine[1].Substring(0, 3);
                            }
                            //TicketNo 字符串长度是否超过8
                            if (aryLine[2].Length <= 8)
                            {
                                dr[2] = aryLine[2].Replace(""", "");
                            }
                            else
                            {
                                dr[2] = aryLine[2].Substring(0, 8);
                            }
                        }
                        else
                        {
                            return dt;//跳出程序,行数大于1000,不做添加,
                        }
                        dt.Rows.Add(dr);
                    }
                }
                if (aryLine != null && aryLine.Length > 0)
                {
                    dt.DefaultView.Sort = tableHead[2];
                }
                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 = 0;
                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 = 14;
    //sql写完后这里嘚坐sql的截取,要不然会报错
                    strSql = strSql.Remove(strSql.Length - i, 11);
                   
                    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 = 0;
                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 - 10);
                    }
    //把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 = 0;
                }
                catch (Exception ex)
                {
                    ExceptionHandler.HandleException(ex);
                  
                    LogHelper.Error(string.Format("添加表数据失败"), ex);
                }
                return result;
            }
            #endregion

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

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

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

  • 相关阅读:
    原生开发、H5开发和混合开发的区别?
    html5:FileAPI 文件操作实战
    web前端是编程语言中更新迭代最快的
    HTTP请求过程
    CSS :placeholder-shown伪类实现Material Design占位符交互效果
    Css中bem书写规范
    全栈开发者意味着什么?
    利用canvas实现转盘抽奖
    12种开源Web安全扫描程序
    移动端适配必须掌握的基本概念和适配方案
  • 原文地址:https://www.cnblogs.com/xwl317/p/7833426.html
Copyright © 2011-2022 走看看