C# 平面文件批量导数据到DB(一)

前言:关于平面文件批量导数据到DB的方法有很多,一直都是用DB解析,可以使用的语句是BCP和BULK。

今天尝试用C# 去处理文件,并导入DB里面,下面一共介绍两种方法,都只是Demo,所以里面很多是hard code,首先是第一种:


 主要是分两步完成:

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; } }

猜你喜欢

转载自www.cnblogs.com/ziqiumeng/p/10552663.html