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

过多下不会见单纯生一个数据文件,比如:

 ACCESS 1ACCESS 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。

相关文章