c#实现几种数据库的大数据批量插入

author author     2023-04-03     485

关键词:

参考技术A 一、SqlServer数据批量插入
SqlServer的批量插入很简单,使用SqlBulkCopy就可以,以下是该类的实现:

复制代码
/// <summary>
/// 为 System.Data.SqlClient 提供的用于批量操作的方法。
/// </summary>
public sealed class MsSqlBatcher : IBatcherProvider

/// <summary>
/// 获取或设置提供者服务的上下文。
/// </summary>
public ServiceContext ServiceContext get; set;
/// <summary>
/// 将 <see cref="DataTable"/> 的数据批量插入到数据库中。
/// </summary>
/// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>
/// <param name="batchSize">每批次写入的数据量。</param>
public void Insert(DataTable dataTable, int batchSize = 10000)

Checker.ArgumentNull(dataTable, "dataTable");
if (dataTable.Rows.Count == 0)

return;

using (var connection = (SqlConnection)ServiceContext.Database.CreateConnection())

try

connection.TryOpen();
//给表名加上前后导符
var tableName = DbUtility.FormatByQuote(ServiceContext.Database.Provider.GetService<ISyntaxProvider>(), dataTable.TableName);
using (var bulk = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, null)

DestinationTableName = tableName,
BatchSize = batchSize
)

//循环所有列,为bulk添加映射
dataTable.EachColumn(c => bulk.ColumnMappings.Add(c.ColumnName, c.ColumnName), c => !c.AutoIncrement);
bulk.WriteToServer(dataTable);
bulk.Close();


catch (Exception exp)

throw new BatcherException(exp);

finally

connection.TryClose();





SqlBulkCopy的ColumnMappings中列的名称受大小写敏感限制,因此在构造DataTable的时候应请注意列名要与表一致。
以上没有使用事务,使用事务在性能上会有一定的影响,如果要使用事务,可以设置SqlBulkCopyOptions.UseInternalTransaction。
复制代码
二、Oracle数据批量插入
System.Data.OracleClient不支持批量插入,因此只能使用Oracle.DataAccess组件来作为提供者。
View Code
以上最重要的一步,就是将DataTable转为数组的数组表示,即object[][],前数组的上标是列的个数,后数组是行的个数,因此循环Columns将后数组作为Parameter的值,也就是说,参数的值是一个数组。而insert语句与一般的插入语句没有什么不一样。
三、SQLite数据批量插入
SQLite的批量插入只需开启事务就可以了,这个具体的原理不得而知。
View Code
四、MySql数据批量插入
复制代码
/// <summary>
/// 为 MySql.Data 组件提供的用于批量操作的方法。
/// </summary>
public sealed class MySqlBatcher : IBatcherProvider

/// <summary>
/// 获取或设置提供者服务的上下文。
/// </summary>
public ServiceContext ServiceContext get; set;
/// <summary>
/// 将 <see cref="DataTable"/> 的数据批量插入到数据库中。
/// </summary>
/// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>
/// <param name="batchSize">每批次写入的数据量。</param>
public void Insert(DataTable dataTable, int batchSize = 10000)

Checker.ArgumentNull(dataTable, "dataTable");
if (dataTable.Rows.Count == 0)

return;

using (var connection = ServiceContext.Database.CreateConnection())

try

connection.TryOpen();
using (var command = ServiceContext.Database.Provider.DbProviderFactory.CreateCommand())

if (command == null)

throw new BatcherException(new ArgumentException("command"));

command.Connection = connection;
command.CommandText = GenerateInserSql(ServiceContext.Database, command, dataTable);
if (command.CommandText == string.Empty)

return;

command.ExecuteNonQuery();


catch (Exception exp)

throw new BatcherException(exp);

finally

connection.TryClose();



/// <summary>
/// 生成插入数据的sql语句。
/// </summary>
/// <param name="database"></param>
/// <param name="command"></param>
/// <param name="table"></param>
/// <returns></returns>
private string GenerateInserSql(IDatabase database, DbCommand command, DataTable table)

var names = new StringBuilder();
var values = new StringBuilder();
var types = new List<DbType>();
var count = table.Columns.Count;
var syntax = database.Provider.GetService<ISyntaxProvider>();
table.EachColumn(c =>

if (names.Length > 0)

names.Append(",");

names.AppendFormat("0", DbUtility.FormatByQuote(syntax, c.ColumnName));
types.Add(c.DataType.GetDbType());
);
var i = 0;
foreach (DataRow row in table.Rows)

if (i > 0)

values.Append(",");

values.Append("(");
for (var j = 0; j < count; j++)

if (j > 0)

values.Append(", ");

var isStrType = IsStringType(types[j]);
var parameter = CreateParameter(database.Provider, isStrType, types[j], row[j], syntax.ParameterPrefix, i, j);
if (parameter != null)

values.Append(parameter.ParameterName);
command.Parameters.Add(parameter);

else if (isStrType)

values.AppendFormat("'0'", row[j]);

else

values.Append(row[j]);


values.Append(")");
i++;

return string.Format("INSERT INTO 0(1) VALUES 2", DbUtility.FormatByQuote(syntax, table.TableName), names, values);

/// <summary>
/// 判断是否为字符串类别。
/// </summary>
/// <param name="dbType"></param>
/// <returns></returns>
private bool IsStringType(DbType dbType)

return dbType == DbType.AnsiString || dbType == DbType.AnsiStringFixedLength || dbType == DbType.String || dbType == DbType.StringFixedLength;

/// <summary>
/// 创建参数。
/// </summary>
/// <param name="provider"></param>
/// <param name="isStrType"></param>
/// <param name="dbType"></param>
/// <param name="value"></param>
/// <param name="parPrefix"></param>
/// <param name="row"></param>
/// <param name="col"></param>
/// <returns></returns>
private DbParameter CreateParameter(IProvider provider, bool isStrType, DbType dbType, object value, char parPrefix, int row, int col)

//如果生成全部的参数,则速度会很慢,因此,只有数据类型为字符串(包含'号)和日期型时才添加参数
if ((isStrType && value.ToString().IndexOf('\'') != -1) || dbType == DbType.DateTime)

var name = string.Format("0p_1_2", parPrefix, row, col);
var parameter = provider.DbProviderFactory.CreateParameter();
parameter.ParameterName = name;
parameter.Direction = ParameterDirection.Input;
parameter.DbType = dbType;
parameter.Value = value;
return parameter;

return null;

在 SQL Server(C# 客户端)中批量插入大量数据的最快方法是啥

...:48【问题描述】:我的C#客户端将批量数据插入SQLServer2005数据库时遇到了一些性能瓶颈,我正在寻找加快该过 查看详情

将数据表批量插入 MS Access (MS Excel) 数据库 (C#)

】将数据表批量插入MSAccess(MSExcel)数据库(C#)【英文标题】:BulkinsertDatatabletoMSAccess(MSExcel)database(C#)【发布时间】:2013-07-2023:04:52【问题描述】:我需要向MicrosoftAccess数据库(accdb文件)插入大量数据(每个表大约500MB)。我的软下... 查看详情

c#通过c#代码向access数据库批量插入数据

...单的能运行的代码更好,谢谢参考技术A难道你不知道“数据库事物”是什么吗?数据库事务就是用于批量对数据库进行插入、修改、删除数据用的。比如,如果一条条向数据库插入数据,如果数据有成千上万条,那么这种插入... 查看详情

c#调用adodb对access数据库执行批量插入

publicvoidBatchInsertIntoAccess(DataTabledt){ADODB.Connectioncn;ADODB.Recordsetrs;stringstrConn=@"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=D:FileTmpMMSCRM.mdb;PersistSecurityInfo=False";cn=newADO 查看详情

使用 c# 代码在更短的时间内将批量 CSV 数据插入 SQLite

...300万条数据。我想在10-15分钟内将这些批量数据插入SQLite数据库。通常使用下面的代码需要20分钟。我的样本:SQLiteConnectioncon=newSQLiteConnec 查看详情

频繁查询的大数据解决方案

】频繁查询的大数据解决方案【英文标题】:Bigdatasolutionforfrequentqueries【发布时间】:2016-12-1906:08:07【问题描述】:我需要一个大数据存储解决方案,用于批量插入不经常发生的非规范化数据以及对频繁发生的插入数据的查询。... 查看详情

jdbc批量插入实现大批量数据快速插入

  今天在做一个将excel数据导入数据库的程序时,由于数据量大,准备采用jdbc的批量插入。于是用了preparedStatement.addBatch();当加入1w条数据时,再执行插入操作,preparedStatement.executeBatch()。我原以为这样会很快,结果插入655... 查看详情

如何使用c#批量新增数据oracledataaccess

...r的批量插入很简单,使用SqlBulkCopy就可以,以下是该类的实现:///<summary>///为System.Data.SqlClient提供的用于批量操作的方法。///</summary>publicsealedclassMsSqlBatcher:IBatcherProvider///<summary>///获取或设置提供者服务的上下文。/... 查看详情

数据库批量数据插入问题分析

在数据库的相关开发中,经常会遇到数据的批量插入问题。本文主要是通过实验的方式探讨批量数据插入的瓶颈,以及优化建议。以10w条记录的插入作为实验对象,采用下面的几种方法插入:1.       普... 查看详情

C# 中的 Sql 批量复制/插入

...述】:我是JSON和SQLBulkCopy的新手。我有一个JSON格式的POST数据,我想使用C#在MicrosoftSQL中批量复制/插入。JSON格式:"URLs":["url_name":"Google","url_address":"http://www.google.com/","u 查看详情

c#调用存储过程实现批量增加和修改数据

1例如当我在编辑表格数据,一次编辑了多行需要保存到数据库时,就需要判断数据库中是否已经存在,存在则修改,不存在则新增一条或多条数据,即所谓批量增加或者跟新数据。  首先需要构建数据包,把要添加或者... 查看详情

批量插入数据

...为所有列批量插入数据实际上,使用一条INSERT语句就可以实现数据的批量插入。与插入一条数据类似,批量插入时,语句中罗列多个VALUES即可,语法格式如下所 查看详情

c#中往mysql里批量插入上万条数据,有比较高效的方法吗

首先,插入上万条数据,对于数据库来说并不是“很大”的工作量,一般配置的笔记本电脑都可以在1分钟内完成。所以最简单、最灵活的办法还是写SQL语句。如果不希望DB编译器每次执行都编译SQL的话,可以使用存储过程,直接... 查看详情

C#中的SQL批量插入不插入值

...s窗体应用程序,它最终应该从不同大小的Excel文件中获取数据,可能每天多次,并 查看详情

java通过mybatis实现批量插入数据到oracle中

...近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式;结合网上资料,写了个小demo,文章末尾附上demo下载地址1、新建项目:项目目录结构如下图所示,... 查看详情

mysql批量插入数据库实现语句性能分析

假定我们的表结构如下代码如下 CREATETABLEexample(example_idINTNOTNULL,nameVARCHAR(50)NOTNULL,valueVARCHAR(50)NOTNULL,other_valueVARCHAR(50)NOTNULL)  通常情况下单条插入的sql语句我们会这么写:代码如下 INSERTINTOexample(example_id, 查看详情

mybatis动态批量插入更新mysql数据库的通用实现方案

一、业务背景  由于需要从A数据库提取大量数据同步到B系统,采用了tomikos+jta进行分布式事务管理,先将系统数据源切换到数据提供方,将需要同步的数据查询出来,然后再将系统数据源切换到数据接收方,进行批量的插入和... 查看详情

c#数据表在位置0插入列

】c#数据表在位置0插入列【英文标题】:c#datatableinsertcolumnatposition0【发布时间】:2010-11-2307:36:36【问题描述】:有谁知道在数据表的位置0处插入列的最佳方法?【问题讨论】:为什么要这样做?列的顺序实际上应该不相关。有... 查看详情