但是应该可以直接调用
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的批量插入很简单,使用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创建数据库,批量添加信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)