1. 程式人生 > >關於C++、C#實現EXCEL資料庫批量匯入資料庫萬行以上資料效率問題

關於C++、C#實現EXCEL資料庫批量匯入資料庫萬行以上資料效率問題

      最近開發一個數據展示、處理的一個管理類網站,開始沒有考慮資料量問題,測試才發現,當excel資料匯入資料庫的時候,隨著資料量的增加,越來越慢。慢的難易理解。

      通過網上查詢發現事務在資料庫中是一個重要的概念,使用事務可以保證資料的統一和完整性。同時也可以提高效率。那麼,如何啟動,提交事務呢?以我當前用的SQLite3資料庫為例:

       1、之前的資料庫執行語句程式碼:(沒有啟用事務)

       #region  執行簡單SQL語句      
        /// <summary>
        /// 執行SQL語句,返回影響的記錄數
        /// </summary>
        /// <paramname="SQLString">SQL語句</param>
        /// <returns>影響的記錄數</returns>
        public static int ExecuteSql(stringSQLString)
        {
            using(SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
               using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection))
               {
                   try
                   {
                       connection.Open();
                       int rows = cmd.ExecuteNonQuery();
                       return rows;
                   }
                   catch (System.Data.SqlClient.SqlException e)
                   {
                       connection.Close();
                       connection.Dispose();
                       throw e;
                   }
               }
            }
        }

        2、修改後的程式碼啟用事務處理

        //宣告一個連線物件
         private SQLiteConnectiondbConnection;
        /// 宣告一個操作資料庫命令
        privateSystem.Data.SQLite.SQLiteCommand dbCommand;
        /// 宣告一個讀取結果集的一個或多個結果流
        privateSystem.Data.SQLite.SQLiteDataReader dbRreader;
        /// 宣告一個事務處理物件
        private DbTransaction trans;

        publicstatic string connectionString =ConfigurationManager.ConnectionStrings["sqlite"].ConnectionString;
       
        //連線資料庫
        //connectionString- 連線字串
        public bool OpenSqlite()
        {
            try
            {
               dbConnection = new SQLiteConnection(connectionString);
               dbConnection.Open();
            }
           catch(Exception e)
            {
               string temp1 = e.ToString();
               return false;
            }
            returntrue;     
        }
        //關閉資料庫連線
        public void CloseSqlite()
        {
            if(dbCommand != null)
            {
               dbCommand.Dispose();
            }
            dbCommand = null;
            if(dbRreader != null)
            {
               dbRreader.Dispose();
            }
            dbRreader =null;
            if(dbConnection != null)
            {
               dbConnection.Close();
            }
            dbConnection= null;
        }
        //開啟事務
        public void SqliteBegin()
        {
            trans =dbConnection.BeginTransaction();
        }
        //提交事務
        public void SqliteCommit()
        {
           trans.Commit();
        }
        /// 執行查詢sqlite語句操作
        public SQLiteDataReaderExecuteQuery(string sqlQuery)
        {
            dbCommand =dbConnection.CreateCommand();
           dbCommand.CommandText = sqlQuery;
            dbRreader =dbCommand.ExecuteReader();
            returndbRreader;
        }
        //應用介紹
        SqliteDB.OpenSqlite();//連線資料庫
        SqliteDB.BeginTransaction();//開啟事務

       SqliteDB.ExecuteQuery(SQLstr);//執行SQL語句

       SqliteDB.Commit();//注意關閉資料庫連線之前一定要提交
        SqliteDB.CloseSqlite();//關閉資料庫連線

     為什麼只是簡單啟用了一個事務會有這麼大的差距呢?很簡單,SQLite 預設為每個操作啟動一個事務,那麼原始碼 1000 次插入起碼開啟了上萬個事務,"事務開啟 + SQL 執行 + 事務關閉" 自然耗費了大量的時間,這也是後面顯示啟動事務後為什麼如此快的原因。其實這是資料庫操作的基本常識,大家要緊記,不好的程式碼效率差的不是一點半點。

相關推薦

關於C++C#實現EXCEL資料庫批量匯入資料庫以上資料效率問題

      最近開發一個數據展示、處理的一個管理類網站,開始沒有考慮資料量問題,測試才發現,當excel資料匯入資料庫的時候,隨著資料量的增加,越來越慢。慢的難易理解。       通過網上查詢發現事務在資料庫中是一個重要的概念,使用事務可以保證資料的統一和完整性。同時也

C++Qt實現的小遊戲2048

圖片 explicit AC 向上 類的構造函數 += cli 而後 遊戲 窗口布局與遊戲截圖: 實現思路: 1.使用二維數組模擬整個遊戲網格,並將二維數組中每個數的大小用作遊戲中每個網格中的數據。 2.將對遊戲的數據及數據的操作(即玩家的操

插入排序的CC++實現

一、插入排序 有一個已經有序的資料序列,要求在這個已經排好的資料序列中插入一個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法——插入排序法,插入排序的基本操作就是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為O(n

氣泡排序的CC++實現

一、氣泡排序 氣泡排序就是重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如數字從大到小、首字母從A到Z)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。 這個演算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端(升序或

【Springboot+mybatis】 解析Excel批量匯入資料庫

【Springboot+mybatis】 解析Excel並批量匯入到資料庫 置頂 2018年01月16日 20:05:52 冉野丶 閱讀數:4060 標籤: excel匯入資料庫 檔案上傳 excel解析 更多 個人分類: POI 工作問題歸納 版權宣告:本文為博主原創文章,未經博主允許不得

POI,servlet,jsp 實現excel檔案的匯入,並存到oracle資料庫

導包 實體類 package com.crh.bean; import java.io.Serializable; /** * @author Chrui * @date 2018/09/24__22:48 */ public class Impor

Excel檔案一鍵上傳並解析完成資料批量匯入資料庫

原來做檔案上傳的時候,都是有一個輸入框,點選上傳按鈕,先瀏覽檔案,選擇檔案後,把檔案的路徑儲存到form表單中,最後通過form表單提交到服務端。這樣的介面不是很美觀。為了使用者有更好地體驗(UE),現在的大多數系統都是採用一鍵檔案上傳,使用者點選上傳按鈕,選擇

CC++實現的一種智慧資料管理架構

之前研究STL相關結構的時候,發現STL系列的map、list、vector等設計有以下缺陷: 1.迭代刪除節點的情況下只可以刪除一個節點(不包括清除所有節點的情況); 2.在多執行緒情況下需要加鎖或臨界區等形式同步物件結構資訊,這種情況屬於當前大部分系統設計的

Excel資料快速大批量匯入資料庫的程式碼

兩種途徑將資料從EXCEL中匯入到SQL SERVER。 一、        在程式中,用ADO.NET。程式碼 如下: //連線串 string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data S

CC++和Java,AIHDOI

c++和java ++ 安全 思維方式 編譯 繼承 編程語言 健壯性 包含 C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。 盡管C語言提供了許多低級處理

Visual Studio Code配置CC++運環境

.json nod 靜態 error 選中文字 變量 ket targe rcu 系統環境:64位 Windows 10 1. 環境的準備 (1)、下載 MinGW-w64 MinGW-w64 - for 32 and 64 bit Windows 在此頁面下載Min

如何學好CC++語言

cat 需要 布局 prime 使用 htm 你好 自信心 small 如何學好C語言 有人在酷殼的留言版上詢問下面的問題 keep_walker : 今天晚上我看到這篇文章。 http://programmers.stackexchange.com/questions/

CC++字符操作歸總

叠代 子串 memmove strcat to_char scn last std bst 1)字符串操作 strcpy(p, p1) 復制字符串 strncpy(p, p1, n) 復制指定長度字符串 strcat(p, p1) 附加字符串 strncat(p, p1,

Ubuntu下怎麽編譯並運CC++和Pascal語言?

tro 開始 用戶 步驟 ide gcc 但是 col inf 很多同學在安裝了Ubuntu的環境後,發現在Windows下的許多東西都打不開了,但是用網站上的在線IDE又不是很方便。 所以,ljn教你如何在Ubuntu下編譯並運行C、C++和Pascal。 一.編譯並

PE檔案結構解析 CC++程式 vc2008編譯

//MyPeFile.h------------------------------------------------------------------------------------------------------ typedef unsigned short USHORT;typ

JavaCC++C#phppython語言的內在特性及應用

當你選擇了網際網路這個行業也就意味著你要終身學習,想必現在的你一定驚歎網際網路的發展速度吧! 網際網路行業不比傳統行業,不是說你精通一門手藝就可以一輩子靠這個手藝來養活自己,網際網路行業沒有這回事,如果你想問有沒有哪一門語言學完之後可以養活自己一輩子,那麼抱歉,我想沒人能回答你。 網際網路發

想分一杯自動駕駛招聘熱潮的羹?先學好C C++Python吧!python

我們正在慢慢進入自動駕駛的時代。 雖然進步神速,而且特斯拉的自動駕駛汽車已經行駛了將近15億英里,但是一些酷炫的事情仍然只存在科幻小說裡。 根據最新麻省理工的一項研究,48%的消費者沒有購買全自動駕駛汽車的意願。 即便如此,對於相關領域的職位,求職者仍然趨之若鶩。自2015

1.CC++與OC

OC與C語言的區別 OC裡中相容C語言的語法可以兩者混合編碼。 OC是面向物件的,有類,物件的概念,C語言沒有 C是面向過程的語言 函式呼叫:Objective-C通過互相傳遞訊息實現函式呼叫,由執行環境決定;而C直接進行函式呼叫,由編譯器決定。 物件記憶體分配,oc所有物件都分配在堆空

LeetCode 868. 二進位制間距(CC++python)

給定一個正整數 N,找到並返回 N 的二進位制表示中兩個連續的 1 之間的最長距離。  如果沒有兩個連續的 1,返回 0 。   示例 1: 輸入:22 輸出:2 解釋: 22 的二進位制是 0b10110 。 在

LeetCode 318. 最大單詞長度乘積(CC++python)

  給定一個字串陣列 words,找到 length(word[i]) * length(word[j]) 的最大值,並且這兩個單詞不含有公共字母。你可以認為每個單詞只包含小寫字母。如果不存在這樣的兩個單詞,返回 0。 示例 1: 輸入: