使用 OLEDB 及 SqlBulkCopy 将多个不在同一文件夹下的 ACCESS mdb 数据文件导入MSSQL

注:转载请标明文章原始出处及作者信息http://www.cnblogs.com/z-huifei/p/7380388.html

前言

OLE DB 是微软的战略性的通向不同的数据源的低级应用程序接口。OLE DB不仅包括微软资助的标准数据接口开放数据库连通性(ODBC)的结构化查询语言(SQL)能力,还具有面向其他非SQL数据类型的通路。OLE DB的存在为用户提供了一种统一的方法来访问所有不同种类的数据源。OLE DB可以在不同的数据源中进行转换。利用OLE DB,客户端的开发人员在进行数据访问时只需把精力集中在很少的一些细节上,而不必弄懂大量不同数据库的访问协议。OLE DB是一套通过COM接口访问数据的ActiveX接口。这个OLE DB接口相当通用,足以提供一种访问数据的统一手段,而不管存储数据所使用的方法如何。同时,OLE DB还允许开发人员继续利用基础数据库技术的优点,而不必为了利用这些优点而把数据移出来。

 

接口介绍

System.Data.OleDb 下的部分成员(相信读者都很眼熟)

OleDbConnection

 表示到数据源的连接是打开。

OleDbCommand

 表示要对数据源执行的 SQL 语句或存储过程。

OleDbDataReader 

 提供了一种从数据源中读取数据行的只进流。

OleDbDataAdapter

 表示一组数据命令和一个数据库连接,它们用于填充 System.Data.DataSet 和更新数据源。

 ......

 ......

 

 

 

 

 

 

 

SqlBulkCopy 允许使用其他源的数据有效地批量加载到 SQL Server 表(这个就是陌生了)

BatchSize

每一批次中的行数。在每一批次结束时,将该批次中的行发送到服务器。

BulkCopyTimeout

 超时之前操作完成所允许的秒数。默认值为 30 秒。值 0 指示没有限制;批量复制将无限期等待。

ColumnMappings

 列映射定义数据源中的列和目标表中的列之间的关系。

DestinationTableName

 目标表的名称。

NotifyAfter

定义在生成通知事件之前要处理的行数。

SqlRowsCopied

事件。每次处理完 System.Data.SqlClient.SqlBulkCopy.NotifyAfter 属性指定的行数时发生。

WriteToServer

 将数据复制到DestinationTableName 属性指定的目标表中。

......

......

 

 

 

 

 

 

 

 

 

终于可以撸代码了

        static void BulkCopy(string fileName) {
            try {
                string connectionString = "server=192.168.1.250;Initial Catalog=demo;user=sa;password=123;";
                string strConn = $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={fileName};";
                string strCom = string.Format("select * from content");

                OleDbConnection conn = new OleDbConnection(strConn);
                OleDbCommand com = new OleDbCommand(strCom, conn);
                conn.Open();
                IDataReader reader = com.ExecuteReader();
                using (SqlBulkCopy bcp = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction)) {
                    bcp.BatchSize = 1000;
                    //bcp.NotifyAfter = 10000;
                    bcp.BulkCopyTimeout = 3600;
                    //bcp.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);//每一批处理完触发事件
                    bcp.DestinationTableName = "content1";
                    bcp.ColumnMappings.Add("id", "id");
                    bcp.ColumnMappings.Add("type1", "typeA");
                    bcp.ColumnMappings.Add("type2", "typeB");
                    bcp.ColumnMappings.Add("type3", "typeC");
                    bcp.ColumnMappings.Add("type4", "typeD");
                    bcp.ColumnMappings.Add("type5", "typeE");
                    bcp.WriteToServer(reader);
                }
                reader.Close();
            }
            catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
           

        }
        private static void bulkCopy_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e) {
            count += 10000;
            //var count = e.RowsCopied;//当前批量复制操作期间复制的行数。
            Console.Clear();
            Console.WriteLine($"{count}条数据已复制完成.");
        }

很多时候不会只有一个数据文件,比如:

 

 遍历取出每个文件夹下的mdb文件

  static void ProRun() {
            List<FileInfo> list = new List<FileInfo>();

            DirectoryInfo dir = new DirectoryInfo(@"E:\XXX");

            var dirInfo = dir.GetDirectories();

            dirInfo.ToList().ForEach(x => {
                x.GetFiles("*.mdb").ToList().ForEach(file => {
                    //排除不需要的文件
                    if (!file.Name.Equals("XXX.mdb")) {
                        list.Add(file);
                    }
                });
            });

            list.ForEach(file => {
                BulkCopy(file.FullName);
            });

        }

 结语:可以更改为SQL,ACCESS,ORACLE,EXCEL....等数据源,因为OLE DB。

posted @ 2017-08-18 10:40 相逢即是猿 阅读(...) 评论(...) 编辑 收藏