数据导入和导出

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秒左右,大大地缩短了插入数据的时间!!!

原文地址:https://www.cnblogs.com/lcxBlog/p/4531826.html