C#读取一个百万条数据的文件,同时批量一次性导入sqlitedb,需要花费多长时间

news2024/11/24 18:45:55

在这里插入图片描述
读取的代码:

      public void CSV2DataTableTest(string fileName)
      {
          FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
          StreamReader sr = new StreamReader(fs, new UnicodeEncoding());
          //记录每次读取的一行记录
          string strLine = "";
          //记录每行记录中的各字段内容
          string[] aryLine;
          //标示列数
          int columnCount = 0;
          //标示是否是读取的第一行
          bool IsFirst = true;

          List<string> Columns = new List<string>();
          Columns.Add("Id INTEGER PRIMARY KEY AUTOINCREMENT  NOT NULL");

          List<List<string>> dtList = new List<List<string>>();
          while ((strLine = sr.ReadLine()) != null)
          {
              aryLine = strLine.Split(',');
              if (IsFirst == true)
              {
                  IsFirst = false;
                  columnCount = aryLine.Length;
                  //创建列
                  for (int i = 0; i < columnCount; i++)
                  {
                      Columns.Add((string)aryLine[i]);
                  }
              }
              else
              {
                  dtList.Add(aryLine.ToList());
              }
          }
          sr.Close();
          fs.Close();
          sr.Dispose();
          fs.Dispose();

          var insertColumns = new List<string>();
          insertColumns.AddRange(Columns);
          insertColumns[0] = "Id";

          SqliteHelper helper = new SqliteHelper();
          string table = "AA3";
          if (!helper.TableExist(table))
              helper.CreateTable(table, Columns);
          else
          {
              helper.ExecuteNonQuery("delete from AA3");
              helper.ExecuteNonQuery("update sqlite_sequence SET seq = 0 where name ='AA3';");
          }
          var dateStart = DateTime.Now;
          helper.OpenConnection();
          helper.InsertDataTest(dtList, insertColumns, table);
          helper.CloseConnection();
          string times = "导入sqlite花费时间" + (DateTime.Now - dateStart).TotalMilliseconds + "ms";
          label2.Text = times;
          dtList.Clear();
          GC.Collect();
      }

插入sqlite代码:


using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestExpression
{
    public class SqliteHelper
    {
        // string db = "Data Source=:memory:";

        //连接字符串
     //   private static string str = "Data source=" + AppDomain.CurrentDomain.BaseDirectory + "\\data.db";
        private static string str = "Data source=" + AppDomain.CurrentDomain.BaseDirectory + "\\D518DCC2-149A-48CC-8355-682B0BF92D26.DB";

        /// <summary>
        /// 增删改
        /// 20180723
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="param">sql参数</param>
        /// <returns>受影响的行数</returns>
        public static int ExecuteNonQuery(string sql, params SQLiteParameter[] param)
        {
            try
            {
                using (SQLiteConnection con = new SQLiteConnection(str))
                {
                    using (SQLiteCommand cmd = new SQLiteCommand(sql, con))
                    {
                        con.Open();
                        if (param != null)
                        {
                            cmd.Parameters.AddRange(param);
                        }

                        string sql2 = cmd.CommandText;
                        //  con.Close();
                        return cmd.ExecuteNonQuery();
                    }
                }
            }
            catch (SQLiteException se)
            {
                return 0;
            }
        }

        /// <summary>
        /// 创建表
        /// </summary>
        /// <param name="dbPath">指定数据库文件</param>
        /// <param name="tableName">表名称</param>
        public void CreateTable(string table, List<string> Columns)
        {
            using (SQLiteConnection con = new SQLiteConnection(str))
            {
                con.Open();
                string Column = "";
                for (int i = 0; i < Columns.Count; i++)
                {
                    Column += Columns[i] + ",";
                }
                Column = Column.Substring(0, Column.Length - 1);
                SQLiteCommand cmd = new SQLiteCommand();
                cmd.Connection = con;
                cmd.CommandText = " CREATE TABLE " + table + "(" + Column + ")";
                cmd.ExecuteNonQuery();
                con.Close();
            }
        }

        /// <summary>
        /// 判断表是否存在
        /// </summary>
        /// <param name="tableName"></param>
        /// <returns></returns>
        public bool TableExist(string table)
        {
            using (SQLiteConnection con = new SQLiteConnection(str))
            {
                con.Open();
                SQLiteCommand mDbCmd = con.CreateCommand();
                mDbCmd.CommandText = "SELECT COUNT(*) FROM sqlite_master where type='table' and name='" + table + "';";
                int row = Convert.ToInt32(mDbCmd.ExecuteScalar());
                con.Close();
                if (0 < row)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }

        /// <summary>
        /// 增删改
        /// 20180723
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="param">sql参数</param>
        /// <returns>受影响的行数</returns>
        public int ExecuteNonQuery(string sql)
        {
            try
            {
                using (SQLiteConnection con = new SQLiteConnection(str))
                {
                    using (SQLiteCommand cmd = new SQLiteCommand(sql, con))
                    {
                        con.Open();
                        string sql2 = cmd.CommandText;
                        //con.Close();
                        return cmd.ExecuteNonQuery();
                    }
                }
            }
            catch (SQLiteException se)
            {
                return 0;
            }
        }

        SQLiteConnection SqlConnection = null;

        public void OpenConnection()
        {
            SqlConnection = new SQLiteConnection(str);
            SqlConnection.Open();
        }

        public void CloseConnection()
        {
            SqlConnection.Close();
        }

        public void InsertDataTest(List<List<string>> dt, List<string> Columns, string tableName)
        {
            SQLiteBulkInsert sbi = new SQLiteBulkInsert(SqlConnection, tableName);
            sbi.AddParameter("Id", DbType.Int32);
            for (int i = 1; i < Columns.Count; i++)
            {
                sbi.AddParameter(Columns[i], DbType.String);
            }


            for (int j = 0; j < dt.Count; j++)
            {
                object[] objects = new object[Columns.Count];
                objects[0] = null;
                for (int i = 1; i < Columns.Count; i++)
                {
                    objects[i]= dt[j][i-1];
                }
                sbi.Insert(objects);
            }
            sbi.Flush();
        }


        public int InsertDataBulk3(List<List<string>> dt, List<string> Columns, string tableName)
        {

            using (SQLiteTransaction tran = SqlConnection.BeginTransaction())
            {
                try
                {
                    string columnStr = string.Join(",", Columns);
                    string columnStr2 = "@" + string.Join(",@", Columns);
                    using (SQLiteCommand command = new SQLiteCommand("Insert into " + tableName + "(" + columnStr + ") values(" + columnStr2 + ")", SqlConnection))
                    {
                        for (int j = 0; j < dt.Count; j++)
                        {
                            var drData = dt[j];
                            command.Parameters.Add(new SQLiteParameter("@Id", null));
                            for (int i = 1; i < Columns.Count; i++)
                            {
                                command.Parameters.Add(new SQLiteParameter("@" + Columns[i], drData[i - 1]));
                            }
                            command.ExecuteNonQuery();
                            command.Parameters.Clear();
                        }
                    }
                    tran.Commit();
                    return 0;
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    return 1;
                }
            }
        }


        public int InsertDataBulk(DataTable dt, List<string> Columns, string tableName)
        {
            using (SQLiteTransaction tran = SqlConnection.BeginTransaction())
            {
                try
                {
                    string columnStr = string.Join(",", Columns);
                    string columnStr2 = "@" + string.Join(",@", Columns);
                    using (SQLiteCommand command = new SQLiteCommand("Insert into " + tableName + "(" + columnStr + ") values(" + columnStr2 + ")", SqlConnection))
                    {
                        foreach (DataRow drData in dt.Rows)
                        {
                            command.Parameters.Add(new SQLiteParameter("@Id", null));
                            for (int i = 1; i < Columns.Count; i++)
                            {
                                command.Parameters.Add(new SQLiteParameter("@" + Columns[i], drData[Columns[i]]));
                            }
                            command.ExecuteNonQuery();
                            command.Parameters.Clear();
                        }
                    }
                    tran.Commit();
                    return 0;
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    return 1;
                }
            }
        }

        public int UpdateDataBulk(Dictionary<int, string?> dt, string changeColumn, string tableName)
        {
            using (SQLiteTransaction tran = SqlConnection.BeginTransaction())
            {
                try
                {
                    using (SQLiteCommand command = new SQLiteCommand("update " + tableName + " set " + changeColumn + "=@" + changeColumn + " where Id=@Id", SqlConnection))
                    {
                        foreach (var drData in dt)
                        {
                            command.Parameters.Add(new SQLiteParameter("@" + changeColumn, drData.Value));
                            command.Parameters.Add(new SQLiteParameter("@Id", drData.Key));
                            command.ExecuteNonQuery();
                            command.Parameters.Clear();
                        }
                    }
                    tran.Commit();
                    return 0;
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    return 1;
                }
            }
        }

        /// <summary>
        /// 查询
        /// 20180723
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="param">sql参数</param>
        /// <returns>首行首列</returns>
        public object ExecuteScalarFirst(string sql)
        {
            try
            {
                using (SQLiteConnection con = new SQLiteConnection(str))
                {
                    using (SQLiteCommand cmd = new SQLiteCommand(con))
                    {
                        con.Open();
                        cmd.CommandText = sql;
                        return cmd.ExecuteScalar();
                    }
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }


        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="param">sql参数</param>
        /// <returns>首行首列</returns>
        public object ExecuteScalar(string sql, params SQLiteParameter[] param)
        {
            using (SQLiteConnection con = new SQLiteConnection(str))
            {
                using (SQLiteCommand cmd = new SQLiteCommand(sql, con))
                {
                    con.Open();
                    if (param != null)
                    {
                        cmd.Parameters.AddRange(param);
                    }

                    return cmd.ExecuteScalar();
                }
            }
        }

        /// <summary>
        /// 多行查询
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="param">sql参数</param>
        /// <returns>SQLiteDateReader</returns>
        public SQLiteDataReader ExecuteReader(string sql, params SQLiteParameter[] param)
        {
            using (SQLiteConnection con = new SQLiteConnection(str))
            {
                using (SQLiteCommand cmd = new SQLiteCommand(sql, con))
                {
                    if (param != null)
                    {
                        cmd.Parameters.AddRange(param);
                    }
                    try
                    {
                        con.Open();
                        return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
                    }
                    catch (Exception ex)
                    {
                        con.Close();
                        con.Dispose();
                        throw ex;
                    }
                }
            }

        }

        /// <summary>
        /// 查询多行数据
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="param">sql参数</param>
        /// <returns>一个表</returns>
        public DataTable ExecuteTable(string sql, params SQLiteParameter[] param)
        {
            DataTable dt = new DataTable();
            using (SQLiteDataAdapter sda = new SQLiteDataAdapter(sql, str))
            {
                if (param != null)
                {
                    sda.SelectCommand.Parameters.AddRange(param);
                }
                sda.Fill(dt);
            }
            return dt;
        }

        /// <summary>
        /// 数据插入
        /// 20180725
        /// </summary>
        /// <param name="tbName">表名</param>
        /// <param name="insertData">需要插入的数据字典</param>
        /// <returns>受影响行数</returns>
        public int ExecuteInsert(string tbName, Dictionary<String, String> insertData)
        {
            string point = "";//分隔符号(,)
            string keyStr = "";//字段名拼接字符串
            string valueStr = "";//值的拼接字符串

            List<SQLiteParameter> param = new List<SQLiteParameter>();
            foreach (string key in insertData.Keys)
            {
                keyStr += string.Format("{0} `{1}`", point, key);
                valueStr += string.Format("{0} @{1}", point, key);
                param.Add(new SQLiteParameter("@" + key, insertData[key]));
                point = ",";
            }
            string sql = string.Format("INSERT INTO `{0}`({1}) VALUES({2})", tbName, keyStr, valueStr);

            //return sql;
            return ExecuteNonQuery(sql, param.ToArray());

        }

        /// <summary>
        /// 执行Update语句
        /// 20180725
        /// </summary>
        /// <param name="tbName">表名</param>
        /// <param name="where">更新条件:id=1</param>
        /// <param name="insertData">需要更新的数据</param>
        /// <returns>受影响行数</returns>
        public int ExecuteUpdate(string tbName, string where, Dictionary<String, String> insertData)
        {
            string point = "";//分隔符号(,)
            string kvStr = "";//键值对拼接字符串(Id=@Id)

            List<SQLiteParameter> param = new List<SQLiteParameter>();
            foreach (string key in insertData.Keys)
            {
                kvStr += string.Format("{0} {1}=@{2}", point, key, key);
                param.Add(new SQLiteParameter("@" + key, insertData[key]));
                point = ",";
            }
            string sql = string.Format("UPDATE `{0}` SET {1} WHERE {2}", tbName, kvStr, where);

            return ExecuteNonQuery(sql, param.ToArray());

        }

        /// <summary>
        /// 查询
        /// 20180723
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="param">sql参数</param>
        /// <returns>首行首列</returns>
        public DataTable GetDataTable(string sql)
        {
            try
            {
                using (SQLiteConnection con = new SQLiteConnection(str))
                {
                    using (SQLiteCommand cmd = new SQLiteCommand(sql, con))
                    {
                        con.Open();
                        SQLiteDataAdapter ad = new SQLiteDataAdapter(cmd);
                        DataTable tb = new DataTable();
                        ad.Fill(tb);
                        con.Close();
                        return tb;

                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return null;

            }

        }


    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1415553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Self-Attention 和 Multi-Head Attention 的区别——附最通俗理解!!

文章目录 前言 一、简要介绍 二、工作流程 三、两者对比 四、通俗理解 前言 随着Transformer模型的迅速普及&#xff0c;Self-Attention&#xff08;自注意力机制&#xff09;和Multi-Head Attention&#xff08;多头注意力机制&#xff09;成为了自然语言处理&#xff08;NLP…

使用一个定时器(timer_fd)管理多个定时事件

使用一个定时器(timer_fd)管理多个定时事件 使用 timerfd_xxx 系列函数可以很方便的与 select、poll、epoll 等IO复用函数相结合&#xff0c;实现基于事件的定时器功能。大体上有两种实现思路&#xff1a; 为每个定时事件创建一个 timer_fd&#xff0c;绑定对应的定时回调函数…

###C语言程序设计-----C语言学习(4)#

前言&#xff1a;感谢老铁的浏览&#xff0c;希望老铁可以一键三连加个关注&#xff0c;您的支持和鼓励是我前进的动力&#xff0c;后续会分享更多学习编程的内容。现在开始今天的内容&#xff1a; 一. 主干知识的学习 1.字符型数据 &#xff08;1&#xff09;字符型常量 字…

腐蚀及膨胀的python实现——数字图像处理

原理 像处理中的腐蚀和膨胀是形态学操作的两个基本概念&#xff0c;它们广泛应用于图像预处理、特征提取和其他图像分析任务。 腐蚀&#xff08;Erosion&#xff09; 腐蚀操作可以看作是图像中形状的"收缩"。其基本原理是使用一个结构元素&#xff08;通常是一个小…

IS-IS:10 ISIS路由渗透

ISIS的非骨干区域&#xff0c;无明细路由&#xff0c;容易导致次优路径问题。可以引入明细路由。 在IS-IS 网络中&#xff0c;所有的 level-2 和 level-1-2 路由器构成了一个连续的骨干区域。 level-1区域必须且只能与骨干区域相连&#xff0c;不同 level-1 区域之间不能直接…

Nginx进阶篇【三】

Nginx进阶篇【三】 四、Rewrite功能配置【ngx_http_rewrite_module模块】4.1."地址重写"与"地址转发"4.2.Rewrite的相关命令4.3.Rewrite的应用场景4.4.Rewrite的相关指令介绍4.4.1. set指令4.4.2. Rewrite常用全局变量4.4.3. if 指令4.4.4. break指令4.4.5…

AI大模型开发架构设计(6)——AIGC时代,如何求职、转型与选择?

文章目录 AIGC时代&#xff0c;如何求职、转型与选择&#xff1f;1 新职场&#xff0c;普通人最值钱的能力是什么?2 新职场成长的3点建议第1点&#xff1a;目标感第2点&#xff1a;执行力第3点&#xff1a;高效生产力 3 新职场会产生哪些新岗位机会?如何借势?4 新职场普通人…

大数据安全 | 期末复习(下)

文章目录 &#x1f4da;安全策略和攻击&#x1f34b;&#x1f407;安全协议&#x1f407;IPsee&#x1f407;SSL&#x1f407;SSH&#x1f407;S/MIME协议&#x1f407;公钥基础设施PKI&#x1f407;PGP&#x1f407;HTTPS&#x1f407;防火墙&#x1f407;防毒墙&#x1f407;…

MQ面试题之Kafka

前言 前文介绍了消息队列相关知识&#xff0c;并未针对某个具体的产品&#xff0c;所以略显抽象。本人毕业到现在使用的都是公司内部产品&#xff0c;对于通用产品无实际经验&#xff0c;但是各种消息中间件大差不差&#xff0c;故而本次选择一个相对较熟悉的Kafka进行详细介绍…

Linux之安装配置CentOS 7

一、CentOS简介 CentOS&#xff08;Community Enterprise Operating System&#xff0c;中文意思是社区企业操作系统&#xff09;是Linux发行版之一&#xff0c;它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码&#xff0c…

综合案例 - 商品列表

文章目录 需求说明1.my-tag组件封装&#xff08;完成初始化&#xff09;2.may-tag封装&#xff08;控制显示隐藏&#xff09;3.my-tag组件封装&#xff08;v-model处理&#xff1a;信息修改&#xff09;4.my-table组件封装&#xff08;整个表格&#xff09;①数据不能写死&…

三角形中任一边小于其余两边之和

在△ABC沿AC做等长BC的延长线CD ∵ B C C D ∵BCCD ∵BCCD ∴ A C B C A D , ∠ D ∠ C B D ∴ACBCAD,∠D∠CBD ∴ACBCAD,∠D∠CBD ∵ ∠ D < ∠ A B D ∵∠D<∠ABD ∵∠D<∠ABD ∴ A B < A D ∴AB<AD ∴AB<AD ∴ A B < A C B C ∴AB<ACBC ∴…

obsidian阅读pdf和文献——与zotero连用

参考&#xff1a; 【基于Obsidian的pdf阅读、标注&#xff0c;构建笔记思维导图&#xff0c;实现笔记标签化、碎片化&#xff0c;便于检索和跳转】 工作流&#xff1a;如何在Obsidian中阅读PDF - Eleven的文章 - 知乎 https://zhuanlan.zhihu.com/p/409627700 操作步骤 基于O…

IMXULL驱动学习——通过总线设备驱动模型点亮野火开发板小灯【参考韦东山老师教程】

参考&#xff1a;【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想&#xff08;学习设备树过渡部分&#xff09;-CSDN博客 韦东山课程&#xff1a;LED模板驱动程序的改造_总线设备驱动模型 我使用的开发板&#xff1a;野火imx6ull pro 欢迎大家一起讨论学习 实现了总线设…

5.Hive表修改Location,一次讲明白

Hive表修改Loction 一、Hive中修改Location语句二、方案1 删表重建1. 创建表&#xff0c;写错误的Location2. 查看Location3. 删表4. 创建表&#xff0c;写正确的Location5. 查看Location 三、方案2 直接修改Location并恢复数据1.建表&#xff0c;指定错误的Location&#xff0…

LeetCode---122双周赛

题目列表 3010. 将数组分成最小总代价的子数组 I 3011. 判断一个数组是否可以变为有序 3012. 通过操作使数组长度最小 3013. 将数组分成最小总代价的子数组 II 一、将数组分成最小总代价的子数组I 这道题纯纯阅读理解题&#xff0c;关键在于理解题意。注意&#xff1a;第一…

C#常见内存泄漏

背景 在开发中由于对语言特性不了解或经验不足或疏忽&#xff0c;往往会造成一些低级bug。而内存泄漏就是最常见的一个&#xff0c;这个问题在测试过程中&#xff0c;因为操作频次低&#xff0c;而不能完全被暴露出来&#xff1b;而在正式使用时&#xff0c;由于使用次数增加&…

Win32 PE图标资源提取(ICO图标提取)

最近需要写一个提取EXE或者DLL图标资源的功能, 网上找了很久, 要么功能不好用, 最后结果如下: 1.很多是加载为HICON句柄后转换为图片保存, 全损画质..., 2.后来找了个还能用的, 详见 https://github.com/TortoiseGit/TortoiseGit/blob/master/src/Utils/IconExtractor.cpp …

Springboot+Netty搭建基于TCP协议的服务端

文章目录 概要pom依赖Netty的server服务端类Netty通道初始化I/O数据读写处理测试发送消息 并 接收服务端回复异步启动Netty运行截图 概要 Netty是业界最流行的nio框架之一&#xff0c;它具有功能强大、性能优异、可定制性和可扩展性的优点 Netty的优点&#xff1a; 1.API使用简…

深度强化学习(王树森)笔记03

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…