关于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 执行 + 事务关闭" 自然耗费了大量的时间,这也是后面显示启动事务后为什么如此快的原因。其实这是数据库操作的基本常识,大家要紧记,不好的代码效率差的不是一点半点。

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值