C# 平面文件批量导数据到DB(一)
前言:关于平面文件批量导数据到DB的方法有很多,有些人是使用foreach一笔一笔地塞到数据库,频繁的与DB建立连接是不推荐的,另外也有人使用OleDbDataAdapter类去将平面文件加载到DataSet里面,这个也不是太好,因为我自己做过测试,某些情况下excel里面的数据没办法全部导入到DataSet,只是一部分数据导入成功了。其实我一直都是用DB解析的,可以使用的语句是BCP和BULK。
本文介绍三种C# 处理文件的方法,并导入DB里面,下面只是Demo,所以里面很多是hard code,虽然不是太好,但还是介绍下OleDbDataAdapter:
主要是分两步完成:
1、使用 OleDbDataAdapter类将平面文件加载到DataSet里面
2、使用 SqlBulkCopy 类将DataTable一次性转移到DB。
using System;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;
private void button1_Click(object sender, EventArgs e) { string excelFilePath = @"D:\ATS\scottzhang\Desktop\ATS工作\临时文件\temp\test\student.xlsx"; string excelSheetName = @"student";//这个是excel的sheet的名字 DataTable tb = new DataTable(); tb = GetExcelTableByOleDB(excelFilePath, excelSheetName); string connectionString = "server = CSHC7256; uid = sa; pwd = Atser123; database = db_test"; using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString)) { bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied); bcp.BatchSize = 100;//每次传输的行数 bcp.NotifyAfter = 100;//进度提示的行数 bcp.DestinationTableName = excelSheetName;//目标表 bcp.WriteToServer(tb); } //进度显示 void bcp_SqlRowsCopied(object sender1, System.Data.SqlClient.SqlRowsCopiedEventArgs e1) { this.Text = e1.RowsCopied.ToString(); this.textBox1.Text = this.textBox1.Text+";"+e1.RowsCopied.ToString(); this.Update(); } } /// <summary> /// 读取Excel中数据 /// </summary> /// <param name="strExcelPath"></param> /// <param name="tableName"></param> /// <returns></returns> public static DataTable GetExcelTableByOleDB(string strExcelPath, string tableName) { try { DataTable dtExcel = new DataTable(""); //数据表 DataSet ds = new DataSet(); //获取文件扩展名 string strExtension = System.IO.Path.GetExtension(strExcelPath); string strFileName = System.IO.Path.GetFileName(strExcelPath); //Excel的连接 OleDbConnection objConn = null; switch (strExtension) { case ".xls": objConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strExcelPath + ";" + "Extended Properties=\"Excel 8.0;HDR=yes;IMEX=1;\""); break; case ".xlsx": objConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelPath + ";" + "Extended Properties=\"Excel 12.0;HDR=yes;IMEX=1;\"");//此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串) 备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数,"HDR=No;"正好与前面的相反。"IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。 break; default: objConn = null; break; } if (objConn == null) { return null; } objConn.Open(); //获取Excel中所有Sheet表的信息 //System.Data.DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null); //获取Excel的第一个Sheet表名 // string tableName1 = schemaTable.Rows[0][2].ToString().Trim(); string strSql = "select * from [" + tableName + "$]"; //获取Excel指定Sheet表中的信息 OleDbCommand objCmd = new OleDbCommand(strSql, objConn); OleDbDataAdapter myData = new OleDbDataAdapter(strSql, objConn); myData.Fill(ds, tableName);//填充数据 objConn.Close(); //dtExcel即为excel文件中指定表中存储的信息 dtExcel = ds.Tables[tableName]; return dtExcel; } catch (Exception ex) { Console.WriteLine(ex.Message + "\r\n" + ex.StackTrace); return null; } }