zoukankan      html  css  js  c++  java
  • 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:ATSscottzhangDesktopATS工作临时文件 emp eststudent.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 + " " + ex.StackTrace); return null; } }
  • 相关阅读:
    前置机器学习(一):数学符号及希腊字母
    大神造轮子与小白调包侠#0509
    Windows下的apache maven安装与配置
    Windows下的apache tomcat安装与配置
    C++ <Algorithm>小小总结
    Markdown 小记
    http状态码
    vim命令
    C++ inline
    爬虫前提——正则表达式语法以及在Python中的使用
  • 原文地址:https://www.cnblogs.com/ziqiumeng/p/10552663.html
Copyright © 2011-2022 走看看