启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题
2016-12-29 00:00
567 查看
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等数据库耗时问题
- 启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题
- 启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题
- 启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题
- 启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题 分类: .NET 2015-06-18 14:39 31人阅读 评论(0) 收藏
- 启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题
- 启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题
- Android Sqlite数据库执行插入查询更新删除的操作对比
- 使用事务操作SQLite数据批量插入,提高数据批量写入速度,源码讲解
- 利用Ibatis执行批量插入更新数据库操作
- 闲暇时间自己写的DB类,支持MDB,SQLITE,SQLSERVER,支持查询、事务,对象直接插入和更新操作等!(10.2更新)
- 如何解决程序中新插入ACCESS数据库表的记录无法及时在数据库中更新的问题。
- Android事务操作(操作sqlite导入大量数据耗时的解决方法)
- Android DB类,支持MDB,SQLITE,SQLSERVER,支持查询、事务,对象直接插入和更新操作等
- c#批量插入数据到数据库【支持事务操作】
- Android Sqlite数据库执行插入查询更新删除的操作对比
- SQLite并发操作下的分析与处理,解决database is locked,以及多线程下执行事务等问题
- Android 4.2中sqlite操作问题(二):某些情况下显式启用事务能提高操作效率
- SQLite中使用约束解决插入/更新重复问题
- 使用mssql2008新特性(存储过程参数类型使用"用户自定义表"来实现批量DML更新多表)解决项目里遇到的性能问题