zoukankan      html  css  js  c++  java
  • 数据导入和导出

    1.  数据导入

       将数据从文件中导入到数据库。

        1. 从文件中读取数据

           2. 将数据插入数据库

            //注意:如果读取文件的编码与文件保存的编码不一致,容易出现乱码
                //File.ReadLines没有第二个参数额重载是采用UTF8编码
                IEnumerable<string> lines = File.ReadLines(filePath, Encoding.Default);
                foreach (string line in lines) 
                {
                    string[] values = line.Split(' ');
                    string userName = values[0];
                    string passWord = values[1];
                    int errorTimes = Convert.ToInt32(values[2]);
    
                    SQLHelper.ExecuteNoQuery("insert into t_user(UserName,PassWord,ErrorTimes) values(@UserName,@PassWord,@ErrorTimes)",
                        new SqlParameter("@UserName", userName),
                           new SqlParameter("@PassWord", passWord),
                              new SqlParameter("@ErrorTimes", errorTimes));
            }

    2.  数据导入   

         数据导出,从数据库中读取数据,然后保存到某个文件中

                DataSet dataset = SQLHelper.ExecuteDataSet("select UserName,PassWord,ErrorTimes from t_user");
                DataTable table = dataset.Tables[0];
                DataRowCollection rows = table.Rows;
    
                string[] strArray = new string[1000];
                foreach (DataRow row in rows)
                {
                    strArray[i] = (string)row["UserName"] + ' ' + (string)row["PassWord"] + ' ' + row["ErrorTimes"];
                }   
                
                string filePath = sfd.FileName;
                File.WriteAllLines(filePath, strArray, Encoding.Default);

    3.  数据导入的优化

       上面数据导入的代码在向数据库导入数据的时候,是这样做的

    foreach( .......)
    {
           //组装数据
           //插入数据
           insert into ........
    }   

           在循环中,每次插入数据都是一条一条地插入,每次插入一条数据都要经过:打开连接——插入数据——关闭连接 这样的操作。如果数据量很大的话,就需要执行很长时间了。例如,以这样的方法插入数据2万多条数据,总共需要耗时20多分钟。在做项目的时候这样做的话,根本伤不起!!!

       所以在数据量大的时候,应该采取批量提交的策略,在提交过程中保持连接的开启,直到数据提交完毕再关闭连接。接下来就该 SqlBulkCopy 这个类出场了,SqlBulkCopy 也实现了IDisposable这个接口,所以它可以在using中使用。

       1.  先用一个本地复杂集合 DataTable来记录要插入的数据

        2.  然后再用 SqlBulkCopy 把整个集合中的数据提交到数据库

     1             string[] lines = File.ReadLines(filePath, Encoding.Default).ToArray();
     2 
     3             string conStr = ConfigurationManager.ConnectionStrings["DBConnStr"].ConnectionString;
     4             using (SqlConnection conn = new SqlConnection(conStr))
     5             {
     6                 conn.Open();
     7                 //创建一个数据表,为该表添加列
     8                 DataTable table = new DataTable();
     9                 table.Columns.Add("PhNum");
    10                 table.Columns.Add("AreaName");
    11                 table.Columns.Add("PhType");
    12                 table.Columns.Add("AreaID");
    13 
    14                 for (int i = 1; i < lines.Count(); i++)
    15                 {
    16                     string[] datas = lines[i].Split('	');
    17                     string PhNum = datas[0];
    18                     string AreaName = datas[1].Trim('"');
    19                     string PhType = datas[2].Trim('"');
    20                     string AreaID = datas[3].Trim('"');
    21 
    22                     DataRow row = table.NewRow();//创建一个DataRow对象
    23                     //一定要在一开始的时候创建Table,并且为Table的Columns添加列
    24                     row["PhNum"] = PhNum;
    25                     row["AreaName"] = AreaName;
    26                     row["PhType"] = PhType;
    27                     row["AreaID"] = AreaID;
    28                     table.Rows.Add(row);//把一行数据插入table中
    29                 }
    30 
    31                 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
    32                 {
    33                     //选择要操作的数据库中的表
    34                     bulkCopy.DestinationTableName = "T_PhNumQuery";
    35                     //添加DataTable中列名和数据库表中列名的映射
    36                     bulkCopy.ColumnMappings.Add("PhNum", "PhNum");
    37                     bulkCopy.ColumnMappings.Add("AreaName", "AreaName");
    38                     bulkCopy.ColumnMappings.Add("PhType", "PhType");
    39                     bulkCopy.ColumnMappings.Add("AreaID", "AreaID");
    40                     bulkCopy.WriteToServer(table);
    41                 }
    42             }

        提交了2万多条数据,总共耗时3秒左右,大大地缩短了插入数据的时间!!!

  • 相关阅读:
    if控制器+循环控制器+计数器,控制接口分支
    前置处理器
    逻辑控制器
    配置元件
    基础元件
    docker etcdctl报错:etcdctl No help topic for 'put'
    celery定时执行ansible api返回为空的问题
    Ansible+Jenkins+Gitlab搭建及配置
    进击的Python【第十六章】:Web前端基础之jQuery
    进击的Python【第十五章】:Web前端基础之DOM
  • 原文地址:https://www.cnblogs.com/lcxBlog/p/4531826.html
Copyright © 2011-2022 走看看