以 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}条数据已复制完成.");
        }

有的是时分不见面仅仅生一个数据文件,比如:

 图片 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。

相关文章