请问高手,如何批量进行数据库插入啊

请问高手,如何批量进行数据库插入啊,第1张

但是应该可以直接调用

SQL

语句吧,我可以在外面组织好

类似

insert

into

new_table(f1,f2,f3)

select

f1,f2,f3

from

old_table;的语句,只要

CI

能够正常调用,并返回执行结果就可以了啊?

还有

$this->db->insert('new_table',$data);与

$this->db->update('new_table',$data);是不是都没有返回结果啊?如果对于有一个自动增量的字段的表,插入时可以不管,系统自动生成,如何得到刚刚新插入记录的自动增量的字段的值呢?

一般这个字段还都是唯一的标识字段的

一、SqlServer数据批量插入

SqlServer的批量插入很简单,使用SqlBulkCopy就可以,以下是该类的实现:

复制代码

/// <summary>

/// 为 SystemDataSqlClient 提供的用于批量 *** 作的方法。

/// </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)

{

CheckerArgumentNull(dataTable, "dataTable");

if (dataTableRowsCount == 0)

{

return;

}

using (var connection = (SqlConnection)ServiceContextDatabaseCreateConnection())

{

try

{

connectionTryOpen();

//给表名加上前后导符

var tableName = DbUtilityFormatByQuote(ServiceContextDatabaseProviderGetService<ISyntaxProvider>(), dataTableTableName);

using (var bulk = new SqlBulkCopy(connection, SqlBulkCopyOptionsKeepIdentity, null)

{

DestinationTableName = tableName,

BatchSize = batchSize

})

{

//循环所有列,为bulk添加映射

dataTableEachColumn(c => bulkColumnMappingsAdd(cColumnName, cColumnName), c => !cAutoIncrement);

bulkWriteToServer(dataTable);

bulkClose();

}

}

catch (Exception exp)

{

throw new BatcherException(exp);

}

finally

{

connectionTryClose();

}

}

}

}

SqlBulkCopy的ColumnMappings中列的名称受大小写敏感限制,因此在构造DataTable的时候应请注意列名要与表一致。

以上没有使用事务,使用事务在性能上会有一定的影响,如果要使用事务,可以设置SqlBulkCopyOptionsUseInternalTransaction。

复制代码

二、Oracle数据批量插入

SystemDataOracleClient不支持批量插入,因此只能使用OracleDataAccess组件来作为提供者。

View Code

以上最重要的一步,就是将DataTable转为数组的数组表示,即object[][],前数组的上标是列的个数,后数组是行的个数,因此循环Columns将后数组作为Parameter的值,也就是说,参数的值是一个数组。而insert语句与一般的插入语句没有什么不一样。

三、SQLite数据批量插入

SQLite的批量插入只需开启事务就可以了,这个具体的原理不得而知。

View Code

四、MySql数据批量插入

复制代码

/// <summary>

/// 为 MySqlData 组件提供的用于批量 *** 作的方法。

/// </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)

{

CheckerArgumentNull(dataTable, "dataTable");

if (dataTableRowsCount == 0)

{

return;

}

using (var connection = ServiceContextDatabaseCreateConnection())

{

try

{

connectionTryOpen();

using (var command = ServiceContextDatabaseProviderDbProviderFactoryCreateCommand())

{

if (command == null)

{

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

}

commandConnection = connection;

commandCommandText = GenerateInserSql(ServiceContextDatabase, command, dataTable);

if (commandCommandText == stringEmpty)

{

return;

}

commandExecuteNonQuery();

}

}

catch (Exception exp)

{

throw new BatcherException(exp);

}

finally

{

connectionTryClose();

}

}

}

/// <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 = tableColumnsCount;

var syntax = databaseProviderGetService<ISyntaxProvider>();

tableEachColumn(c =>

{

if (namesLength > 0)

{

namesAppend(",");

}

namesAppendFormat("{0}", DbUtilityFormatByQuote(syntax, cColumnName));

typesAdd(cDataTypeGetDbType());

});

var i = 0;

foreach (DataRow row in tableRows)

{

if (i > 0)

{

valuesAppend(",");

}

valuesAppend("(");

for (var j = 0; j < count; j++)

{

if (j > 0)

{

valuesAppend(", ");

}

var isStrType = IsStringType(types[j]);

var parameter = CreateParameter(databaseProvider, isStrType, types[j], row[j], syntaxParameterPrefix, i, j);

if (parameter != null)

{

valuesAppend(parameterParameterName);

commandParametersAdd(parameter);

}

else if (isStrType)

{

valuesAppendFormat("'{0}'", row[j]);

}

else

{

valuesAppend(row[j]);

}

}

valuesAppend(")");

i++;

}

return stringFormat("INSERT INTO {0}({1}) VALUES {2}", DbUtilityFormatByQuote(syntax, tableTableName), names, values);

}

/// <summary>

/// 判断是否为字符串类别。

/// </summary>

/// <param name="dbType"></param>

/// <returns></returns>

private bool IsStringType(DbType dbType)

{

return dbType == DbTypeAnsiString || dbType == DbTypeAnsiStringFixedLength || dbType == DbTypeString || dbType == DbTypeStringFixedLength;

}

/// <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 && valueToString()IndexOf('\'') != -1) || dbType == DbTypeDateTime)

{

var name = stringFormat("{0}p_{1}_{2}", parPrefix, row, col);

var parameter = providerDbProviderFactoryCreateParameter();

parameterParameterName = name;

parameterDirection = ParameterDirectionInput;

parameterDbType = dbType;

parameterValue = value;

return parameter;

}

return null;

}

}

选择开始菜单中→程序→Management SQL Server 2008→SQL Server Management Studio命令,打开SQL Server Management Studio窗口,并使用Windows或 SQL Server身份验证建立连接。

在对象资源管理器窗口中展开服务器,然后选择数据库节点

右键单击数据库节点,从d出来的快捷菜单中选择新建数据库命令。

执行上述 *** 作后,会d出新建数据库对话框。在对话框、左侧有3个选项,分别是常规、选项和文件组。完成这三个选项中的设置会后,就完成了数据库的创建工作,

在数据库名称文本框中输入要新建数据库的名称。例如,这里以“新建的数据库”。

在所有者文本框中输入新建数据库的所有者,如sa。根据数据库的使用情况,选择启用或者禁用使用全文索引复选框。

在数据库文件列表中包括两行,一行是数据库文件,而另一行是日记文件。通过单击下面的添加、删除按钮添加或删除数据库文件。

切换到选项页、在这里可以设置数据库的排序规则、恢复模式、兼容级别和其他属性。

切换到文件组页,在这里可以添加或删除文件组。

完成以上 *** 作后,单击确定按钮关闭新建数据库对话框。至此“新建的数据”数据库创建成功。新建的数据库可以再对象资源管理器窗口看到。

怎么在ACCESS已有的数据中添加新的批量数据的方法。

如下参考:

1首先,打开Access并创建一个新的数据库,如下图所示。

2然后创建一个新的数据回表,添加数据字段。

3然后将数据添加到数据表中,如下图所示。

4然后在SQL编辑区域中编写Update语句,并在其中做出判断。

5接下来,将d出更新对话框。点击“是”按钮,如下图所示。

6最后,重新查询数据表中的数据,可以看到数据已经根据判断条件进行了更新。

表结构以都是文本为例:

执行语句:

update 表1 set 

日期=年+switch

(月='一月','1月',月='二月','2月',月='三月','3月',月='四月','4月',月='五月','5月',月='六月','6月',月='七月','7月',月='八月','8月',月='九月','9月',月='十月','10月',月='十一月','11月',true,'12月')+switch(left(日,1)='0',mid(日,2,len(日)-1),true,日)

更新后结果:

要是其他数据类型的话,请另外说明

一、针对批量插入数据,如果量不是太多,可以多条SQL语句运行就可以了,

类似下面的语句,当然可以使用excel 编辑后,复制到查询器中运行,

insert into table(a,b) values('1','a')

insert into table(a,b) values('2','b')

insert into table(a,b) values('3','c')

二、大量数批量插入,即数据表的移植,数据备份转换之类的,就需要工具,比如MSSQL的DTS工具,pb的数据通道 等等。这里介绍一下 DTS工具。

1、在SQL安装目录下开启导入和导出数据,即DTS。

2、选择一个批量的数据,可以是表,也可以是带分隔符的文件,或excel文档之类,如图中选择,导入的格式

3、选择导入的目标

4、选择导入方式

5具体的导入规则

以上就是关于请问高手,如何批量进行数据库插入啊全部的内容,包括:请问高手,如何批量进行数据库插入啊、c#实现几种数据库的大数据批量插入、怎么用eclipse创建数据库,批量添加信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9326015.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存