动用 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接口11分通用,足以提供一种访问数据的会面手段,而不管存款和储蓄数据所利用的法子怎么着。同时,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}条数据已复制完成.");
        }

有的是时候不会唯有2个数据文件,比如:

 图片 1图片 2

 遍历取出每一个文件夹下的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。

相关文章