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