新手求助怎样向mysql数据库中的数据表批量插入数据

新手求助怎样向mysql数据库中的数据表批量插入数据,第1张

drop procedure if exists s_card;

delimiter $$

CREATE PROCEDURE s_card()

BEGIN

DECLARE j INT(11);

loop1: WHILE j<=1000 DO

insert INTO `tablename`(xxxxxx) values (xxx);

SET j=j+1;

END WHILE loop1;

END$$

delimiter ;

把上面存储过程运行一下,输入 call s_card()可以循环插入1000条数据

如果要指定输入条数可以把数字从外界传入

如果是sql server,用transaction sql写;

如果是oracle,用pl/sql写。

这两种语法都可以写一些逻辑语句,跟一些高级语言差不多,随便搜一下就有介绍了。自己学学,不多讲了。

用JDBC也可以,不过稍微麻烦点。用上面的方法可以直接在DBMS的客户端运行,简单直接。

--------------------------------------------

上面我说的,好像不太适合你这个问题。确实用JDBC(Java语言)或ODBC(C++)写代码能实现:循环读文件里面的每条数据,生成相应的sql语句,然后调用API写入数据库。

还有一个方法就是,用txt或excel保存数据,然后用sql server2000的企业管理器导入txt或excel文档,你按着向导试试看。

可以使用oracle

sql

loader批量导入数据:

 生成测试数据的EXCEL文件,把EXCEL文件另存为CSV(逗号分隔)(csv),控制文件设置为用逗号分隔。

示例:

LOAD

DATA

INFILE

‘d:\carcsv’

APPEND

INTO

TABLE

t_car_temp

FIELDS

TERMINATED

BY

","

(phoneno,vip_car)

保存为inputctl

最后在命令行下输入:

C:\>sqlldr

userid=system/manager

control=inputctl(在unix环境下亦同)

默认日志文件名为:inputlog

默认坏记录文件为:inputbad

首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了。///<summary>/// 提供数据批量处理的方法。 ///</summary>publicinterface IBatcherProvider : IProviderService { ///<summary>/// 将<see cref="DataTable"/> 的数据批量插入到数据库中。 ///</summary>///<param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>///<param name="batchSize">每批次写入的数据量。</param>void Insert(DataTable dataTable, int batchSize = 10000); }一、SqlServer数据批量插入SqlServer的批量插入很简单,使用SqlBulkCopy就可以,以下是该类的实现:///<summary>/// 为SystemDataSqlClient 提供的用于批量 *** 作的方法。 ///</summary>publicsealedclass 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>publicvoid 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) { thrownew BatcherException(exp); } finally { connectionTryClose(); } } } }以上没有使用事务,使用事务在性能上会有一定的影响,如果要使用事务,可以设置SqlBulkCopyOptionsUseInternalTransaction。二、Oracle数据批量插入SystemDataOracleClient不支持批量插入,因此只能使用OracleDataAccess组件来作为提供者。///<summary>/// OracleDataAccess 组件提供的用于批量 *** 作的方法。 ///</summary>publicsealedclass OracleAccessBatcher : IBatcherProvider { ///<summary>/// 获取或设置提供者服务的上下文。 ///</summary>public ServiceContext ServiceContext { get; set; } ///<summary>/// 将<see cref="DataTable"/> 的数据批量插入到数据库中。 ///</summary>///<param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>///<param name="batchSize">每批次写入的数据量。</param>publicvoid 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) { thrownew BatcherException(new ArgumentException("command")); } commandConnection = connection; commandCommandText = GenerateInserSql(ServiceContextDatabase, command, dataTable); commandExecuteNonQuery(); } } catch (Exception exp) { thrownew BatcherException(exp); } finally { connectionTryClose(); } } } ///<summary>/// 生成插入数据的sql语句。 ///</summary>///<param name="database"></param>///<param name="command"></param>///<param name="table"></param>///<returns></returns>privatestring GenerateInserSql(IDatabase database, DbCommand command, DataTable table) { var names = new StringBuilder(); var values = new StringBuilder(); //将一个DataTable的数据转换为数组的数组var data = tableToArray(); //设置ArrayBindCount属性 commandGetType()GetProperty("ArrayBindCount")SetValue(command, tableRowsCount, null); var syntax = databaseProviderGetService<ISyntaxProvider>(); for (var i = 0; i < tableColumnsCount; i++) { var column = tableColumns[i]; var parameter = databaseProviderDbProviderFactoryCreateParameter(); if (parameter == null) { continue; } parameterParameterName = columnColumnName; parameterDirection = ParameterDirectionInput; parameterDbType = columnDataTypeGetDbType(); parameterValue = data[i]; if (namesLength > 0) { namesAppend(","); valuesAppend(","); } namesAppendFormat("{0}", DbUtilityFormatByQuote(syntax, columnColumnName)); valuesAppendFormat("{0}{1}", syntaxParameterPrefix, columnColumnName); commandParametersAdd(parameter); } returnstringFormat("INSERT INTO {0}({1}) VALUES ({2})", DbUtilityFormatByQuote(syntax, tableTableName), names, values); } }以上最重要的一步,就是将DataTable转为数组的数组表示,即object[][],前数组的上标是列的个数,后数组是行的个数,因此循环Columns将后数组作为Parameter的值,也就是说,参数的值是一个数组。而insert语句与一般的插入语句没有什么不一样。三、SQLite数据批量插入SQLite的批量插入只需开启事务就可以了,这个具体的原理不得而知。publicsealedclass SQLiteBatcher : IBatcherProvider { ///<summary>/// 获取或设置提供者服务的上下文。 ///</summary>public ServiceContext ServiceContext { get; set; } ///<summary>/// 将<see cref="DataTable"/> 的数据批量插入到数据库中。 ///</summary>///<param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>///<param name="batchSize">每批次写入的数据量。</param>publicvoid Insert(DataTable dataTable, int batchSize = 10000) { CheckerArgumentNull(dataTable, "dataTable"); if (dataTableRowsCount == 0) { return; } using (var connection = ServiceContextDatabaseCreateConnection()) { DbTransaction transcation = null; try { connectionTryOpen(); transcation = connectionBeginTransaction(); using (var command = ServiceContextDatabaseProviderDbProviderFactoryCreateCommand()) { if (command == null) { thrownew BatcherException(new ArgumentException("command")); } commandConnection = connection; commandCommandText = GenerateInserSql(ServiceContextDatabase, dataTable); if (commandCommandText == stringEmpty) { return; } var flag = new AssertFlag(); dataTableEachRow(row => { var first = flagAssertTrue(); ProcessCommandParameters(dataTable, command, row, first); commandExecuteNonQuery(); }); } transcationCommit(); } catch (Exception exp) { if (transcation != null) { transcationRollback(); } thrownew BatcherException(exp); } finally { connectionTryClose(); } } } privatevoid ProcessCommandParameters(DataTable dataTable, DbCommand command, DataRow row, bool first) { for (var c = 0; c < dataTableColumnsCount; c++) { DbParameter parameter; //首次创建参数,是为了使用缓存if (first) { parameter = ServiceContextDatabaseProviderDbProviderFactoryCreateParameter(); parameterParameterName = dataTableColumns[c]ColumnName; commandParametersAdd(parameter); } else { parameter = commandParameters[c]; } parameterValue = row[c]; } } ///<summary>/// 生成插入数据的sql语句。 ///</summary>///<param name="database"></param>///<param name="table"></param>///<returns></returns>privatestring GenerateInserSql(IDatabase database, DataTable table) { var syntax = databaseProviderGetService<ISyntaxProvider>(); var names = new StringBuilder(); var values = new StringBuilder(); var flag = new AssertFlag(); tableEachColumn(column => { if (!flagAssertTrue()) { namesAppend(","); valuesAppend(","); } namesAppend(DbUtilityFormatByQuote(syntax, columnColumnName)); valuesAppendFormat("{0}{1}", syntaxParameterPrefix, columnColumnName); }); returnstringFormat("INSERT INTO {0}({1}) VALUES ({2})", DbUtilityFormatByQuote(syntax, tableTableName), names, values); } } 四、MySql数据批量插入///<summary>/// 为MySqlData 组件提供的用于批量 *** 作的方法。 ///</summary>publicsealedclass 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>publicvoid 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) { thrownew BatcherException(new ArgumentException("command")); } commandConnection = connection; commandCommandText = GenerateInserSql(ServiceContextDatabase, command, dataTable); if (commandCommandText == stringEmpty) { return; } commandExecuteNonQuery(); } } catch (Exception exp) { thrownew BatcherException(exp); } finally { connectionTryClose(); } } } ///<summary>/// 生成插入数据的sql语句。 ///</summary>///<param name="database"></param>///<param name="command"></param>///<param name="table"></param>///<returns></returns>privatestring 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); } elseif (isStrType) { valuesAppendFormat("'{0}'", row[j]); } else { valuesAppend(row[j]); } } valuesAppend(")"); i++; } returnstringFormat("INSERT INTO {0}({1}) VALUES {2}", DbUtilityFormatByQuote(syntax, tableTableName), names, values); } ///<summary>/// 判断是否为字符串类别。 ///</summary>///<param name="dbType"></param>///<returns></returns>privatebool 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; } returnnull; } }MySql的批量插入,是将值全部写在语句的values里,例如,insert batcher(id, name) values(1, '1', 2, '2', 3, '3', 10, '10')。五、测试接下来写一个测试用例来看一下使用批量插入的效果。

批量插入不要用循环,直接sql语句就可以了:

insert

into

table

(`field`,

`field2`)

values

('val',

'val2'),

('v2',

'v3');

这样就可以了,上面的sql批量了2条,以此类推,中间隔半角逗号即可。

我就晕了,你不会用程序处理啊,用一个array_map然后implode不久可以了吗?

具体的 *** 作步骤如下:首先,用Access打开mdb文件。导出成txt文件,由于本人的SQLite是在linux下使用,所以编码要改成Unicode,分隔符用逗号分割(逗号分割是为了后期导入到SQLite中)第二步,将文件导入到linux系统下通过终端sqlite3abcdbSQLiteversion3622Enter"help"forinstructionsEnterSQLstatementsterminatedwitha";"sqlite进入一个已经建好的数据库中sqliteCREATETABLEeee(idINTEGERPRIMARYKEY,numberNUMERIC,codeNUMERIC,cityTEXT,citytypeTEXT);创建一个表,这个表的字段和数据类型要和txt文件中的数据和数据类型相对应。sqliteseparator","//设置分割符为逗号,和之前导出设置的分隔符保持一致sqliteimportlisttxteee//将listtxt上的内容导入到表eee中到此,已成功地将批量数据插入到SQLite中了。

以上就是关于新手求助怎样向mysql数据库中的数据表批量插入数据全部的内容,包括:新手求助怎样向mysql数据库中的数据表批量插入数据、如何用SQL语句将数据批量插入数据库、如何在oracle数据库中的表里批量插入记录等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/sjk/9737456.html

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

发表评论

登录后才能评论

评论列表(0条)

保存