使用 OLEDB 及 SqlBulkCopy 将多个不在同一文件…
2018-06-18 00:52:23来源:未知 阅读 ()
注:转载请标明文章原始出处及作者信息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。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:使用XmlReader读Xml
- C++ 在名称空间中使用using声明和using编译指令 2020-05-29
- 1.ffmpeg、ffplay、ffprobe命令使用 2020-05-11
- 关于使用ffmpeg的一些牢骚 2020-05-08
- G++编译链接的那些事!G++的特殊使用方法[常用] 2020-04-19
- c/c++ 使用valgrind检查内存泄漏 2020-04-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash