Oracl 一條sql語句 批量添加、修改數據

来源:http://www.cnblogs.com/xwl317/archive/2017/11/14/7833426.html
-Advertisement-
Play Games

最近一直在用,也一直在學oralc,項目上也用到了批量的添加(讀取上傳CSV文件信息,把符合條件的信息寫入到資料庫中),在寫的時候想到了可能是數據量大就想該怎麼快,(由於本人在.NET開發期間沒有做過深度的優化) 上傳CSV文件有專門的方法,只要複製進去就好了 上傳完成的CSV文件返回的DataTa ...


      最近一直在用,也一直在學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

這樣就完成了數據的修改,

由於臨時想起來寫博客,沒有準備充分,

有什麼不妥的歡迎大家指出,歡迎大家吧問題指出來,然後大家共同進步

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近公司開發的h5項目,需要用到sass,所以領導推薦讓我去阮一峰大神的SASS用法指南博客學習,為方便以後自己使用,所以在此記錄。 一、代碼的重用 1、繼承:SASS允許一個選擇器,繼承另一個選擇器。 class2要繼承class1,就要使用@extend命令: 2、Mixin:Mixin有點像C ...
  • 現今對於大多數公司來說,信息安全工作尤為重要,就像京東,阿裡巴巴這樣的大公司來說,信息安全是最為重要的一個話題,舉個簡單的例子: 就像這樣的密碼公開化,很容易造成一定的信息的泄露。所以今天我們要講的就是如何來實現密碼的加密和解密來提高數據的安全性。 在這首先要引入springboot融合mybati ...
  • http://www.pinhuba.com/oracle/101128.htm ...
  • 接著上一篇,這篇文章分析一下redis事務操作中multi,exec,discard三個核心命令。 原文地址:http://www.jianshu.com/p/e22615586595 看本篇文章前需要先對上面文章有所瞭解: "redis源碼分析之事務Transaction(上)" 一、redis事 ...
  • 這周學習了一下redis事務功能的實現原理,本來是想用一篇文章進行總結的,寫完以後發現這塊內容比較多,而且多個命令之間又互相依賴,放在一篇文章里一方面篇幅會比較大,另一方面文章組織結構會比較亂,不容易閱讀。因此把事務這個模塊整理成上下兩篇文章進行總結。 原文地址:http://www.jianshu ...
  • 備份 RMAN>show all; RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON; 設置控制文件自動備份 RMAN> backup database format='/home/oracle/myrman/prod_%s.bak' filesperset 3; ...
  • 第一: MySQL的安裝 下載MySQL軟體,修改安裝路徑之後 安裝資料庫MySQL5.7.18 第一步:資料庫MySQL5.7.18可以在官網上下載對應的版本,下載地址:http://www.filehorse.com/download-mysql-64/, 第二步:將下載好的安裝包進行解壓到一個 ...
  • 上一篇簡要介紹了圖資料庫的一些基本內容(初識SQL Server2017 圖資料庫(一)),本篇通過對比關係型一些語法來體現圖資料庫模式的一些優點,比如查詢方便,語句易理解等。 在圖資料庫模型上構建查詢的優勢: T-SQL 帶給圖表查詢一些新的語法。在SELECT語句中我們有一些特殊的語句來關聯點和 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...