zoukankan      html  css  js  c++  java
  • 使用 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。

    实践是检验真理的唯一标准
  • 相关阅读:
    算法之美_源码公布(5)
    SDL2源码分析2:窗体(SDL_Window)
    hdu5303Delicious Apples
    Android之怎样给ListView加入过滤器
    EntboostChat 0.9(越狱版)公布,iOS免费企业IM
    unix关于打包命令zip的使用
    用 query 方法 获得xml 节点的值
    用友ERP T6技术解析(六) 库龄分析
    [笔试题] 两个有趣的问题
    使用SecueCRT在本地主机与远程主机之间交互文件
  • 原文地址:https://www.cnblogs.com/z-huifei/p/7380388.html
Copyright © 2011-2022 走看看