启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题
private void button1_Click(object sender, EventArgs e)
{
//Sqlite使用事务批量操作 极大的提高速度
DateTime starttime = DateTime.Now;
using (SQLiteConnection con = new SQLiteConnection(connStr))
{
con.Open();
DbTransaction trans = con.BeginTransaction();//开始事务
SQLiteCommand cmd = new SQLiteCommand(con);
try
{
cmd.CommandText = "INSERT INTO MyTable(username,useraddr,userage) VALUES(@a,@b,@c)";
for (int n = 0; n < 100000; n++)
{
cmd.Parameters.Add(new SQLiteParameter("@a", DbType.String)); //MySql 使用MySqlDbType.String
cmd.Parameters.Add(new SQLiteParameter("@b", DbType.String)); //MySql 引用MySql.Data.dll
cmd.Parameters.Add(new SQLiteParameter("@c", DbType.String));
cmd.Parameters["@a"].Value = "张三" + n;
cmd.Parameters["@b"].Value = "深圳" + n;
cmd.Parameters["@c"].Value = 10 + n;
cmd.ExecuteNonQuery();
}
trans.Commit();//提交事务
DateTime endtime = DateTime.Now;
MessageBox.Show("插入成功,用时" + (endtime - starttime).TotalMilliseconds); }
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
//MySql 事务批量提交 极大提交速度
try
{
using (MySqlConnection con = new MySqlConnection(MySqlStr))
{
con.Open();
DbTransaction trans = con.BeginTransaction();//开始事务 #region 防重复先删除
//循环本地Sqlite数据库数据
for (int i = 0; i < count; i++)
{
DataRow dr = ds.Tables[0].Rows[i];
string sqlDelete = "delete from packect where proimei=@d";
MySqlCommand cmd1 = new MySqlCommand(sqlDelete, con);
cmd1.Parameters.Add(new MySqlParameter("@d", MySqlDbType.String));
cmd1.Parameters["@d"].Value = dr["proimei"];
cmd1.ExecuteNonQuery();
}
#endregion #region 新增数据
//循环本地Sqlite数据库数据
for (int i = 0; i < count; i++)
{
DataRow dr = ds.Tables[0].Rows[i];
string sqlInsert = "insert into packect(proimei, prokg, proadddate) values(@a,@b,@c)";
MySqlCommand cmd2 = new MySqlCommand(sqlInsert, con);
cmd2.Parameters.Add(new MySqlParameter("@a", MySqlDbType.String));
cmd2.Parameters.Add(new MySqlParameter("@b", MySqlDbType.Decimal));
cmd2.Parameters.Add(new MySqlParameter("@c", MySqlDbType.DateTime));
cmd2.Parameters["@a"].Value = dr["proimei"];
cmd2.Parameters["@b"].Value = dr["prokg"];
cmd2.Parameters["@c"].Value = dr["proadddate"];
cmd2.ExecuteNonQuery();
}
#endregion trans.Commit();//提交事务
DateTime endtime = DateTime.Now;
MessageBox.Show("上传数据成功,用时" + (endtime - starttime).TotalMilliseconds + "毫秒!");
//清空本地数据库
SQLiteHelper.ExecuteNonQuery(connStr, "delete from table1", CommandType.Text);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
/*
DataTable dt = new DataTable();
//定义需要插入的字段,字段名需跟数据库字段保持一致
dt.Columns.Add("username");
dt.Columns.Add("useraddr");
dt.Columns.Add("userage");
for (int i = 0; i < 10000; i++)
{
dt.Rows.Add("张三" + i, "深圳" + i, i);
}
DateTime starttime = DateTime.Now;
SqlBulkCopyInsert(dt, "mytable");
DateTime endtime = DateTime.Now;
Response.Write("插入成功,用时" + (endtime - starttime).TotalSeconds + "秒");
*/
/// <summary>
/// 使用SqlBulkCopy批量插入,只限SQLServer,超大数据量快速导入
/// </summary>
/// <param name="table">填充的DataTable,支持其它数据源,请看重载</param>
/// <param name="tableName">数据库对应表名</param>
public void SqlBulkCopyInsert(DataTable table, string tableName)
{
SqlBulkCopy sbc = new SqlBulkCopy(MSCL.Until.GetApp("SqlConnStr"));
sbc.DestinationTableName = tableName; for (int i = 0; i < table.Columns.Count; i++)
{
sbc.ColumnMappings.Add(table.Columns[i].ColumnName, table.Columns[i].ColumnName);
}
sbc.WriteToServer(table);
}
/// <summary>
/// 使用SqlBulkCopy批量插入,只限SQLServer,超大数据量快速导入
/// 缺点,没有返回行数
/// </summary>
/// <param name="table">填充的DataTable,支持其它数据源,请看重载</param>
/// <param name="tableName">数据库对应表名</param>
/// <param name="columns">插入表对应的列名集合</param>
public void SqlBulkCopyInsert(DataTable table, string tableName, string[] columns)
{
SqlBulkCopy sbc = new SqlBulkCopy("接连字符串");
sbc.DestinationTableName = tableName;
foreach (string col in columns)
{
sbc.ColumnMappings.Add(col, col);
}
sbc.WriteToServer(table);
} /// <summary>
/// 多行插入,Connection/Command/DataAdapter看你连接的数据库类型
/// 进行相应的替换即可
/// </summary>
/// <param name="ds">填充数据后的数据集</param>
/// <returns>受影响行数</returns>
public int MultyInsert(DataSet ds)
{
int result = 0;
IDbConnection con = new OracleConnection("连接字符串");
con.Open();
IDbCommand cmd = new OracleCommand();
cmd.CommandText = "Insert into Member(UserName,Password) values(@name,@password)";
IDbDataParameter namePar = cmd.CreateParameter();
namePar.ParameterName = "@name";
namePar.SourceColumn = "UserName";
namePar.SourceVersion = DataRowVersion.Original;
namePar.DbType = DbType.String;
cmd.Parameters.Add(namePar); IDbDataParameter passPar = cmd.CreateParameter();
passPar.ParameterName = "@pass";
passPar.DbType = DbType.String;
passPar.SourceColumn = "Password";
passPar.SourceVersion = DataRowVersion.Original;
cmd.Parameters.Add(passPar); IDbDataAdapter adpt = new OracleDataAdapter();
adpt.InsertCommand = cmd;
try
{
result = adpt.Update(ds);
}
catch (Exception)
{ throw;
}
finally
{
con.Close();
}
return result;
}
/*
* Oracle中非常强大快速的数据批量操作方法
*/
////引用
//using System.Data;
//using System.Data.OracleClient;
//using Oracle.DataAccess.Client; //Oracle自带数据访问组件 位置: $Oracle安装路径$/bin/Oracle.DataAccess.dll
//设置一个数据库的连接串
string connectStr = "User Id=scott;Password=tiger;Data Source=";
OracleConnection conn = new OracleConnection(connectStr);
OracleCommand command = new OracleCommand();
command.Connection = conn;
//到此为止,还都是我们熟悉的代码,下面就要开始喽
//这个参数需要指定每次批插入的记录数
int recc = 10000000;
command.ArrayBindCount = recc;
//在这个命令行中,用到了参数,参数我们很熟悉,但是这个参数在传值的时候
//用到的是数组,而不是单个的值,这就是它独特的地方
command.CommandText = "insert into dept values(:deptno, :deptname, :loc)";
conn.Open();
//下面定义几个数组,分别表示三个字段,数组的长度由参数直接给出
int[] deptNo = new int[recc];
string[] dname = new string[recc];
string[] loc = new string[recc];
// 为了传递参数,不可避免的要使用参数,下面会连续定义三个
// 从名称可以直接看出每个参数的含义,不在每个解释了
OracleParameter deptNoParam = new OracleParameter("deptno", OracleType.Int32);
deptNoParam.Direction = ParameterDirection.Input;
deptNoParam.Value = deptNo;
command.Parameters.Add(deptNoParam);
OracleParameter deptNameParam = new OracleParameter("deptname", OracleType.VarChar);
deptNameParam.Direction = ParameterDirection.Input;
deptNameParam.Value = dname; command.Parameters.Add(deptNameParam);
OracleParameter deptLocParam = new OracleParameter("loc", OracleType.VarChar);
deptLocParam.Direction = ParameterDirection.Input;
deptLocParam.Value = loc;
command.Parameters.Add(deptLocParam);
//在下面的循环中,先把数组定义好,而不是像上面那样直接生成SQL
for (int i = 0; i < recc; i++)
{
deptNo[i] = i;
dname[i] = i.ToString();
loc[i] = i.ToString();
}
//这个调用将把参数数组传进SQL,同时写入数据库
command.ExecuteNonQuery();

启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题的更多相关文章
- Hibernate批处理操作优化 (批量插入、更新与删除)
问题描述 我开发的网站加了个新功能:需要在线上处理表数据的批量合并和更新,昨天下午发布上线,执行该功能后,服务器的load突然增高,变化曲线异常,SA教育了我一番,让我尽快处理,将CPU负载降低. 工 ...
- C#使用SqlDataAdapter 实现数据的批量插入和更新
近日由于项目要求在需要实现中型数据的批量插入和更新,晚上无聊,在网上看到看到这样的一个实现方法,特摘抄过来,以便以后可能用到参考. 一.数据的插入 DateTime begin = DateTime. ...
- .net使用SqlBulkCopy类操作DataTable批量插入数据库数据,然后分页查询坑
在使用SqlBulkCopy类操作DataTable批量插入数据,这种操作插入数据的效率很高,就会导致每一条数据在保存的时间基本一样,在我们分页查询添加的数据是,使用数据的添加时间来排序就会出现每页的 ...
- MySQL on duplicate key update 批量插入并更新已存在数据
业务上经常存在一种现象,需要批量往表中插入多条数据,但在执行过程中,很可能因为唯一键冲突,而导致批量插入失败.因此需要事先判断哪些数据是重复的,哪些是新增的.比较常用的处理方法就是找出已存在的数据,并 ...
- java批量插入或更新的问题
在批量插入或者更新中,setXXX的时候字段类型必须一致.例如:在普通sql中 pstmt8.setBigDecimal(j ,xxx);可以写成pstmt8.setString(j,xxx.toSt ...
- SQL server 批量插入和更新数据
批量插入数据 insert into A表数据库名.[dbo].A(a,b,c) (select a,b,c from B表数据库名.[dbo].B) 批量更新数据 根据身份证第二位更新性别 upda ...
- mybatis 注解的方式批量插入,更新数据
一,当向数据表中插入一条数据时,一般先检查该数据是否已经存在,如果存在更新,不存在则新增 使用关键字 ON DUPLICATE KEY UPDATE zk_device_id为主键 model ...
- 定时从远程的数据库中取数据,然后把取出来的数据插入或更新本地的oracle数据库的表
最近项目中有一种需求: 大致需求是这样的 通过给定的 用户名和密码 要定时从远程的数据库中取数据,然后把取出来的数据插入或更新本地的oracle数据库的表 项目的结构式struts1 hibernat ...
- Set,Sorted Set相关命令操作,批量插入及管道,事务
Set SADD key member [member ...] 向key指定的set集合添加成员,次集合是排重的,从2.4版本后才支持添加多个如果key不存在则创建key以及set集合返回当前操作成 ...
随机推荐
- Android学习记录:Paint,Canvas和Bitmap
在Java中,利用过双缓冲技术,先将画笔画在内存上,再转化为图片,调出来. 当画的东西过多造成处理不过来时,双缓冲技术将防止闪屏. 在Paint方法下,我们这样写: BufferedImage tmp ...
- Httprequest 获取url 常用方法
HttpServletRequest常用获取URL的方法 1.request.getRequestURL() 返回的是完整的url,包括Http协议,端口号,servlet名字和映射路 ...
- NHibernate教程(21)——二级缓存(下)
本节内容 引入 使用NHibernate二级缓存 启用缓存查询 管理NHibernate二级缓存 结语 引入 这篇我还继续上一篇的话题聊聊NHibernate二级缓存剩下的内容,比如你修改.删除数据时 ...
- MPLS LDP随堂笔记1
LDP 的使用原因(对于不同协议来说) LDP的四大功能 发现邻居 hello 5s 15s 224.0.0.2 发现邻居关系 R1 UDP 646端口 R2 UDP 646端口 此时形成邻居 建立邻 ...
- Alpha 版本测试和发布说明
Alpha版本测试报告 一bug汇总 做题时答案是错的.(已修复) 每次生成的题目一样(已经修复) 计时没有显示即倒计时,难度不同的功能没有实现(打算修复) 没有导入试卷和错题功能(不打算修复) 二. ...
- 201521123082 《Java程序设计》第5周学习总结
201521123082 <Java程序设计>第5周学习总结 标签(空格分隔): java 1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规 ...
- 201521123007《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 作业参考文件下载 1. 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.jav ...
- Java-错误处理机制学习(一)异常处理
注意:本文介绍Java中的异常处理理论知识及相关语法结构,对于实际应用来说是万万不够的.关于如何高效地使用异常,请查看Java-高效地使用Exception-实践. 异常处理的思想是,当应用程序处于异 ...
- 201521123010 《Java程序设计》第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 ①finally 题目4-2 1.1 截图你的提交结果(出现 ...
- 201521123049 《JAVA程序设计》 第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出 ...