C#将excel数据导入mdb的三种方法(针对5万条数据)

问题描述:将存有5.6万条的excel表数据导入mdb中

解决办法:

1.DAO。优点:速度快,5.6万条数据,也就不到一分钟,缺点:对于我来说,本机编译好的exe不能在其他电脑运行,最后查出来是DAO的问题。

2.用事务。优点:不依赖于DAO,直接靠using System.Data.OleDb;就能解决,速度为5.6万条数据455秒,缺点:速度慢,在所有行插入完之前,mdb中看不到进度情况。

3.用adapter.Update()。优点:不依赖于DAO,直接靠using System.Data.OleDb,DataTable改变,mdb中的表就能跟着改变,速度为5.6万条数据578秒,能在插入过程中看到进度情况,缺点:速度慢,DataTable的改变也是不断插入行才行,曾试图采用DataTable.Merge(datatable),结果mdb不更新。

详细代码:

1.DAO

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;
using OSGeo.GDAL;
using OSGeo.OGR;
using DAO = Microsoft.Office.Interop.Access.Dao;
using System.Collections;
using System.Runtime.InteropServices;
using System.Diagnostics;


//定义
DAO.Database db;

            db = dbEngine.OpenDatabase(filepath);
            string tablename_encoding = "行政编码表";
//dt_excel获取方法与后面两个例子一致
            Recordset rs1 = db.OpenRecordset(tablename_encoding);
            Field[] myfields_1 = new Field[dt_excel.Columns.Count];
            for (int i = 0; i < dt_excel.Columns.Count; i++)
            {
                myfields_1[i] = rs1.Fields[dt_excel.Columns[i].ColumnName];
            }
            for (int i = 0; i < dt_excel.Rows.Count; i++)
            {
                rs1.AddNew();
                for (int j = 0; j < myfields_1.Length; j++)
                {
                    myfields_1[j].Value = dt_excel.Rows[i][j];
                }
                rs1.Update();
            }
            rs1.Close();

2.事务

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 将excel批量插入mdb
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
//设置要导入到mdb的excel路径
            string path_excel = @"C:\Users\Administrator\Desktop\新建文件夹\TestData\附件三:河南省行政编码表.xlsx";
//设置要导入的mdb文件路径
            string path_mdb = @"C:\Users\Administrator\Desktop\新建文件夹\TestData\000012中华财险保险公司承保数据20200810.mdb";
//读取excel内容到DataTable
            DataTable dt_excel = GetExcelTable(path_excel, "行政编码表");
//建立mdb数据库连接
            OleDbConnection ole_mdb = GetMdb(path_mdb);
            //1.根据dt_excel 在mdb中创建表结构
            string sql = "create table " + "行政编码表" + "(";
            for (int i = 0; i < dt_excel.Columns.Count; i = i + 1)
            {
                sql += dt_excel.Columns[i].ColumnName + " varchar(40),";
            }
            sql = sql.Substring(0, sql.Length - 1);
            sql += ")";
            OleDbCommand cmd = new OleDbCommand(sql, ole_mdb);
            cmd.ExecuteNonQuery();
//计时工具,启动
            int startTime = System.Environment.TickCount;
            //2.批量插入数据
//对于dt_excel中的每一行,写插入语句,并存放在ArrayList 中
            ArrayList sqllist = new ArrayList();
            for (int i=0;i<dt_excel.Rows.Count;i++) {
                sql = "INSERT INTO 行政编码表 (县名称, 管辖区名称, 乡镇名称, 村名称,行政村编码 ) " +"VALUES (\"" + dt_excel.Rows[i][0].ToString() + "\"" +

                              ",\"" + dt_excel.Rows[i][1].ToString() + "\"" +

                              ",\"" + dt_excel.Rows[i][2].ToString() + "\"" +

                              ",\"" + dt_excel.Rows[i][3].ToString() + "\"" +

                              ",\"" + dt_excel.Rows[i][4].ToString() + "\")";
                sqllist.Add(sql);
            }
//用事务挨个插入sqllist中的数据并提交
            insertToStockDataByBatch(sqllist,ole_mdb);
//计时工具,停止
            int endTime = System.Environment.TickCount;
            int runTime = (endTime - startTime) / 1000;
            MessageBox.Show("用时:" + runTime + "秒");
        }
//方法:将excel转为datatable
        public DataTable GetExcelTable(string excelFilename, string tableName)
        {
            //建立与指定Excel文件的连接
            string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Jet OLEDB:Engine Type=35;Extended Properties=Excel 8.0;Persist Security Info=False", excelFilename);
            DataSet ds = new DataSet();  //数据集
            //using中声明的对象connection,在using语句块结束后会自动释放
            using (System.Data.OleDb.OleDbConnection connection = new System.Data.OleDb.OleDbConnection(connectionString))
            {
                connection.Open();
                //获取数据库架构信息,包括列、主键、表等信息
                DataTable table = connection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);

                string strExcel = "select * from " + "[" + tableName + "$]";
                //打开数据链接,得到一个数据集
                OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, connectionString);
                //在数据集中查询表名为tableName的表,然后把其数据在装入数据集ds中
                adapter.Fill(ds, tableName);

                connection.Close();
            }
            return ds.Tables[tableName];//以datatable类型返回数据集ds中表名为tableName的表
        }
//方法:连接到mdb数据库
        public OleDbConnection GetMdb(string filepath)
        {
            try
            {
                string sqlcon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + "; Persist Security Info =False";
                OleDbConnection ole_mdb = new OleDbConnection(@sqlcon);
                ole_mdb.Open();
                MessageBox.Show(filepath + "--读取成功");
                //db = dbEngine.OpenDatabase(filepath);
                return ole_mdb;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return null;
            }
        }
//方法:打开mdb连接,启动事务,逐行插入,提交事务
public  void insertToStockDataByBatch(ArrayList sqlArray,OleDbConnection oleDb)
        {
            try
            {
                if (oleDb.State==ConnectionState.Closed) { oleDb.Open(); }
                OleDbTransaction transaction = oleDb.BeginTransaction();
                OleDbCommand aCommand = new OleDbCommand();
                aCommand.Connection = oleDb;
                aCommand.Transaction = transaction;
                for (int i = 0; i < sqlArray.Count; i++)
                {
                    aCommand.CommandText = sqlArray[i].ToString();
                    aCommand.ExecuteNonQuery();
                }
                transaction.Commit();
                oleDb.Close();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }

        }
    }
}
   

 3.adapter.Update()

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 将excel批量插入mdb
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string path_excel = @"C:\Users\Administrator\Desktop\新建文件夹\TestData\附件三:河南省行政编码表.xlsx";
            string path_mdb = @"C:\Users\Administrator\Desktop\新建文件夹\TestData\000012中华财险保险公司承保数据20200810.mdb";
            DataTable dt_excel = GetExcelTable(path_excel, "行政编码表");
            OleDbConnection ole_mdb = GetMdb(path_mdb);
            //开始尝试塞进去
            //1.在mdb中创建表结构
            string sql = "create table " + "行政编码表" + "(";
            for (int i = 0; i < dt_excel.Columns.Count; i = i + 1)
            {
                sql += dt_excel.Columns[i].ColumnName + " varchar(40),";
            }
            sql = sql.Substring(0, sql.Length - 1);
            sql += ")";
            OleDbCommand cmd = new OleDbCommand(sql, ole_mdb);
            cmd.ExecuteNonQuery();
            int startTime = System.Environment.TickCount;

            //2.批量插入数据
            CreateCmdsAndUpdate(ole_mdb, "select * from [行政编码表]", dt_excel);
            int endTime = System.Environment.TickCount;
            int runTime = (endTime - startTime) / 1000;
            MessageBox.Show("用时:" + runTime + "秒");
        }
        public DataTable GetExcelTable(string excelFilename, string tableName)
        {
            //建立与指定Excel文件的连接
            string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Jet OLEDB:Engine Type=35;Extended Properties=Excel 8.0;Persist Security Info=False", excelFilename);
            DataSet ds = new DataSet();  //数据集
            //using中声明的对象connection,在using语句块结束后会自动释放
            using (System.Data.OleDb.OleDbConnection connection = new System.Data.OleDb.OleDbConnection(connectionString))
            {
                connection.Open();
                //获取数据库架构信息,包括列、主键、表等信息
                DataTable table = connection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);

                string strExcel = "select * from " + "[" + tableName + "$]";
                //打开数据链接,得到一个数据集
                OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, connectionString);
                //在数据集中查询表名为tableName的表,然后把其数据在装入数据集ds中
                adapter.Fill(ds, tableName);

                connection.Close();
            }
            return ds.Tables[tableName];//以datatable类型返回数据集ds中表名为tableName的表
        }
        public OleDbConnection GetMdb(string filepath)
        {
            try
            {
                string sqlcon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + "; Persist Security Info =False";
                OleDbConnection ole_mdb = new OleDbConnection(@sqlcon);
                ole_mdb.Open();
                MessageBox.Show(filepath + "--读取成功");
                //db = dbEngine.OpenDatabase(filepath);
                return ole_mdb;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return null;
            }
        }

//方法:使用update更新datatable
        public DataTable CreateCmdsAndUpdate(OleDbConnection oleDbConnection, string queryString, DataTable dt)
        {
            using (oleDbConnection)
            {
                OleDbDataAdapter adapter = new OleDbDataAdapter();
                adapter.AcceptChangesDuringFill = false;
                adapter.SelectCommand = new OleDbCommand(queryString, oleDbConnection);
                OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
                if (oleDbConnection.State == ConnectionState.Closed) { oleDbConnection.Open(); }
                DataTable customers = new DataTable();
                adapter.Fill(customers);

                //code to modify data in DataTable here
//dt表示与mdb数据库关联的表,dt_exel表示存储excel数据的表
//尝试用dt.Merge(dt_excel),运行没问题,但mdb中并未插入数据,失败
//尝试用dt=dt_excel,运行没问题,但mdb中并未插入数据,失败
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    DataRow dr = customers.NewRow();
                    dr["县名称"] = dt.Rows[i][0].ToString();
                    dr["管辖区名称"] = dt.Rows[i][1].ToString();
                    dr["乡镇名称"] = dt.Rows[i][2].ToString();
                    dr["村名称"] = dt.Rows[i][3].ToString();
                    dr["行政村编码"] = dt.Rows[i][4].ToString();
                    customers.Rows.Add(dr);
                }
                adapter.Update(customers);
                return customers;
            }
        }
    }
}
   

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将 Excel 表格写入 MDB 文件(Microsoft Access 数据库文件),你可以使用 C# 中的 OleDbConnection 和 OleDbDataAdapter 类来实现。下面是一个示例代码: ```csharp using System; using System.Data; using System.Data.OleDb; namespace ExcelToMDB { class Program { static void Main(string[] args) { string excelFilePath = @"path\to\your\excel\file.xlsx"; string mdbFilePath = @"path\to\your\mdb\file.mdb"; string excelConnectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelFilePath};Extended Properties='Excel 12.0 Xml;HDR=YES;'"; string mdbConnectionString = $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={mdbFilePath}"; using (OleDbConnection excelConnection = new OleDbConnection(excelConnectionString)) using (OleDbConnection mdbConnection = new OleDbConnection(mdbConnectionString)) { try { excelConnection.Open(); mdbConnection.Open(); // 从 Excel 表格中读取数据 string selectQuery = "SELECT * FROM [Sheet1$]"; OleDbDataAdapter dataAdapter = new OleDbDataAdapter(selectQuery, excelConnection); DataTable dataTable = new DataTable(); dataAdapter.Fill(dataTable); // 将数据写入 MDB 文件 using (OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(dataAdapter)) { dataAdapter.InsertCommand = commandBuilder.GetInsertCommand(); dataAdapter.Update(dataTable); Console.WriteLine("Data written to MDB file successfully!"); } } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } } } } } ``` 在上面的代码中,你需要将 `path\to\your\excel\file.xlsx` 替换为实际的 Excel 文件路径,将 `path\to\your\mdb\file.mdb` 替换为实际的 MDB 文件路径。 首先,使用 `Microsoft.ACE.OLEDB.12.0` 提供程序创建一个连接字符串来连接到 Excel 文件。然后,使用 `Microsoft.Jet.OLEDB.4.0` 提供程序创建一个连接字符串来连接到 MDB 文件。 接下来,使用 OleDbConnection 打开 ExcelMDB 的连接。 然后,使用 OleDbDataAdapter 从 Excel 表格中读取数据,并将其填充到一个 DataTable 中。 最后,使用 OleDbCommandBuilder 创建插入命令,并使用 OleDbDataAdapter 的 Update 方法数据写入 MDB 文件。 请确保你的系统中安装了适当的 OLEDB 提供程序(如 `Microsoft.ACE.OLEDB.12.0`)和相应的驱动程序。 希望这能满足你的需求!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值