啓用事務操做,解決批量插入或更新sqlite,mssql等數據庫耗時問題 分類: .NET 2015-06-18 14:39 31人閱讀 評論(0) 收藏

原文地址:http://blog.csdn.net/smartsmile2012/article/details/22167179sql


  1. private void button1_Click(object sender, EventArgs e)  
  2. {  
  3.     //Sqlite使用事務批量操做 極大的提升速度  
  4.     DateTime starttime = DateTime.Now;  
  5.     using (SQLiteConnection con = new SQLiteConnection(connStr))  
  6.     {  
  7.         con.Open();  
  8.         DbTransaction trans = con.BeginTransaction();//開始事務       
  9.         SQLiteCommand cmd = new SQLiteCommand(con);  
  10.         try  
  11.         {  
  12.             cmd.CommandText = "INSERT INTO MyTable(username,useraddr,userage) VALUES(@a,@b,@c)";  
  13.             for (int n = 0; n < 100000; n++)  
  14.             {  
  15.                 cmd.Parameters.Add(new SQLiteParameter("@a", DbType.String)); //MySql 使用MySqlDbType.String  
  16.                 cmd.Parameters.Add(new SQLiteParameter("@b", DbType.String)); //MySql 引用MySql.Data.dll  
  17.                 cmd.Parameters.Add(new SQLiteParameter("@c", DbType.String));  
  18.                 cmd.Parameters["@a"].Value = "張三" + n;  
  19.                 cmd.Parameters["@b"].Value = "深圳" + n;  
  20.                 cmd.Parameters["@c"].Value = 10 + n;  
  21.                 cmd.ExecuteNonQuery();  
  22.             }  
  23.             trans.Commit();//提交事務    
  24.             DateTime endtime = DateTime.Now;  
  25.             MessageBox.Show("插入成功,用時" + (endtime - starttime).TotalMilliseconds);  
  26.   
  27.         }  
  28.         catch(Exception ex)  
  29.         {  
  30.             MessageBox.Show(ex.Message);  
  31.         }  
  32.     }  
  33. }  
[csharp]  view plain copy print ? 在CODE上查看代碼片 派生到個人代碼片
  1. //MySql 事務批量提交 極大提交速度  
  2. try  
  3. {  
  4.     using (MySqlConnection con = new MySqlConnection(MySqlStr))  
  5.     {  
  6.     con.Open();  
  7.     DbTransaction trans = con.BeginTransaction();//開始事務    
  8.  
  9.     #region 防重複先刪除  
  10.     //循環本地Sqlite數據庫數據  
  11.     for (int i = 0; i < count; i++)  
  12.     {  
  13.         DataRow dr = ds.Tables[0].Rows[i];  
  14.         string sqlDelete = "delete from packect where proimei=@d";  
  15.         MySqlCommand cmd1 = new MySqlCommand(sqlDelete, con);                             
  16.         cmd1.Parameters.Add(new MySqlParameter("@d", MySqlDbType.String));  
  17.         cmd1.Parameters["@d"].Value = dr["proimei"];  
  18.         cmd1.ExecuteNonQuery();  
  19.     }  
  20.     #endregion  
  21.  
  22.  
  23.     #region 新增數據  
  24.     //循環本地Sqlite數據庫數據  
  25.     for (int i = 0; i < count; i++)  
  26.     {  
  27.         DataRow dr = ds.Tables[0].Rows[i];  
  28.         string sqlInsert = "insert into packect(proimei, prokg, proadddate) values(@a,@b,@c)";  
  29.         MySqlCommand cmd2 = new MySqlCommand(sqlInsert, con);    
  30.         cmd2.Parameters.Add(new MySqlParameter("@a", MySqlDbType.String));  
  31.         cmd2.Parameters.Add(new MySqlParameter("@b", MySqlDbType.Decimal));  
  32.         cmd2.Parameters.Add(new MySqlParameter("@c", MySqlDbType.DateTime));  
  33.         cmd2.Parameters["@a"].Value = dr["proimei"];  
  34.         cmd2.Parameters["@b"].Value = dr["prokg"];  
  35.         cmd2.Parameters["@c"].Value = dr["proadddate"];  
  36.         cmd2.ExecuteNonQuery();  
  37.     }  
  38.     #endregion  
  39.   
  40.     trans.Commit();//提交事務      
  41.     DateTime endtime = DateTime.Now;  
  42.     MessageBox.Show("上傳數據成功,用時" + (endtime - starttime).TotalMilliseconds + "毫秒!");  
  43.     //清空本地數據庫  
  44.     SQLiteHelper.ExecuteNonQuery(connStr, "delete from table1", CommandType.Text);  
  45.     }  
  46. }  
  47. catch (Exception ex)  
  48. {  
  49.     MessageBox.Show(ex.Message);  
  50. }  
[csharp]  view plain copy print ? 在CODE上查看代碼片 派生到個人代碼片
  1. /* 
  2.     DataTable dt = new DataTable(); 
  3.     //定義須要插入的字段,字段名需跟數據庫字段保持一致 
  4.     dt.Columns.Add("username"); 
  5.     dt.Columns.Add("useraddr"); 
  6.     dt.Columns.Add("userage"); 
  7.     for (int i = 0; i < 10000; i++) 
  8.     { 
  9.         dt.Rows.Add("張三" + i, "深圳" + i, i); 
  10.     } 
  11.     DateTime starttime = DateTime.Now; 
  12.     SqlBulkCopyInsert(dt, "mytable"); 
  13.     DateTime endtime = DateTime.Now; 
  14.     Response.Write("插入成功,用時" + (endtime - starttime).TotalSeconds + "秒");      
  15.  */  
  16. /// <summary>      
  17. /// 使用SqlBulkCopy批量插入,只限SQLServer,超大數據量快速導入       
  18. /// </summary>      
  19. /// <param name="table">填充的DataTable,支持其它數據源,請看重載</param>      
  20. /// <param name="tableName">數據庫對應表名</param>        
  21. public void SqlBulkCopyInsert(DataTable table, string tableName)  
  22. {  
  23.     SqlBulkCopy sbc = new SqlBulkCopy(MSCL.Until.GetApp("SqlConnStr"));  
  24.     sbc.DestinationTableName = tableName;  
  25.   
  26.     for (int i = 0; i < table.Columns.Count; i++)  
  27.     {  
  28.         sbc.ColumnMappings.Add(table.Columns[i].ColumnName, table.Columns[i].ColumnName);  
  29.     }  
  30.     sbc.WriteToServer(table);  
  31. }   
[csharp]  view plain copy print ? 在CODE上查看代碼片 派生到個人代碼片
  1. /// <summary>    
  2. /// 使用SqlBulkCopy批量插入,只限SQLServer,超大數據量快速導入    
  3. /// 缺點,沒有返回行數    
  4. /// </summary>    
  5. /// <param name="table">填充的DataTable,支持其它數據源,請看重載</param>    
  6. /// <param name="tableName">數據庫對應表名</param>    
  7. /// <param name="columns">插入表對應的列名集合</param>    
  8. public void SqlBulkCopyInsert(DataTable table, string tableName, string[] columns)  
  9. {  
  10.     SqlBulkCopy sbc = new SqlBulkCopy("接連字符串");  
  11.     sbc.DestinationTableName = tableName;  
  12.     foreach (string col in columns)  
  13.     {  
  14.         sbc.ColumnMappings.Add(col, col);  
  15.     }  
  16.     sbc.WriteToServer(table);  
  17. }  
  18.   
  19.   
  20. /// <summary>    
  21. /// 多行插入,Connection/Command/DataAdapter看你鏈接的數據庫類型    
  22. /// 進行相應的替換便可    
  23. /// </summary>    
  24. /// <param name="ds">填充數據後的數據集</param>    
  25. /// <returns>受影響行數</returns>    
  26. public int MultyInsert(DataSet ds)  
  27. {  
  28.     int result = 0;  
  29.     IDbConnection con = new OracleConnection("鏈接字符串");  
  30.     con.Open();  
  31.     IDbCommand cmd = new OracleCommand();  
  32.     cmd.CommandText = "Insert into Member(UserName,Password) values(@name,@password)";  
  33.     IDbDataParameter namePar = cmd.CreateParameter();  
  34.     namePar.ParameterName = "@name";  
  35.     namePar.SourceColumn = "UserName";  
  36.     namePar.SourceVersion = DataRowVersion.Original;  
  37.     namePar.DbType = DbType.String;  
  38.     cmd.Parameters.Add(namePar);  
  39.   
  40.     IDbDataParameter passPar = cmd.CreateParameter();  
  41.     passPar.ParameterName = "@pass";  
  42.     passPar.DbType = DbType.String;  
  43.     passPar.SourceColumn = "Password";  
  44.     passPar.SourceVersion = DataRowVersion.Original;  
  45.     cmd.Parameters.Add(passPar);  
  46.   
  47.     IDbDataAdapter adpt = new OracleDataAdapter();  
  48.     adpt.InsertCommand = cmd;  
  49.     try  
  50.     {  
  51.         result = adpt.Update(ds);  
  52.     }  
  53.     catch (Exception)  
  54.     {  
  55.   
  56.         throw;  
  57.     }  
  58.     finally  
  59.     {  
  60.         con.Close();  
  61.     }  
  62.     return result;  
  63. }    
[csharp]  view plain copy print ? 在CODE上查看代碼片 派生到個人代碼片
  1. /* 
  2.  * Oracle中很是強大快速的數據批量操做方法 
  3. */  
  4. ////引用  
  5. //using System.Data;  
  6. //using System.Data.OracleClient;  
  7. //using Oracle.DataAccess.Client; //Oracle自帶數據訪問組件 位置: $Oracle安裝路徑$/bin/Oracle.DataAccess.dll  
  8. //設置一個數據庫的鏈接串  
  9. string connectStr = "User Id=scott;Password=tiger;Data Source=";  
  10. OracleConnection conn = new OracleConnection(connectStr);  
  11. OracleCommand command = new OracleCommand();  
  12. command.Connection = conn;  
  13. //到此爲止,還都是咱們熟悉的代碼,下面就要開始嘍  
  14. //這個參數須要指定每次批插入的記錄數  
  15. int recc = 10000000;  
  16. command.ArrayBindCount = recc;  
  17. //在這個命令行中,用到了參數,參數咱們很熟悉,可是這個參數在傳值的時候  
  18. //用到的是數組,而不是單個的值,這就是它獨特的地方  
  19. command.CommandText = "insert into dept values(:deptno, :deptname, :loc)";  
  20. conn.Open();  
  21. //下面定義幾個數組,分別表示三個字段,數組的長度由參數直接給出  
  22. int[] deptNo = new int[recc];  
  23. string[] dname = new string[recc];  
  24. string[] loc = new string[recc];  
  25. // 爲了傳遞參數,不可避免的要使用參數,下面會連續定義三個  
  26. // 從名稱能夠直接看出每一個參數的含義,不在每一個解釋了  
  27. OracleParameter deptNoParam = new OracleParameter("deptno", OracleType.Int32);  
  28. deptNoParam.Direction =  ParameterDirection.Input;  
  29. deptNoParam.Value = deptNo;  
  30. command.Parameters.Add(deptNoParam);  
  31. OracleParameter deptNameParam = new OracleParameter("deptname", OracleType.VarChar);  
  32. deptNameParam.Direction = ParameterDirection.Input;  
  33. deptNameParam.Value = dname; command.Parameters.Add(deptNameParam);  
  34. OracleParameter deptLocParam = new OracleParameter("loc", OracleType.VarChar);  
  35. deptLocParam.Direction = ParameterDirection.Input;  
  36. deptLocParam.Value = loc;  
  37. command.Parameters.Add(deptLocParam);  
  38. //在下面的循環中,先把數組定義好,而不是像上面那樣直接生成SQL  
  39. for (int i = 0; i < recc; i++)  
  40. {  
  41.     deptNo[i] = i;  
  42.     dname[i] = i.ToString();  
  43.     loc[i] = i.ToString();  
  44. }  
  45. //這個調用將把參數數組傳進SQL,同時寫入數據庫  
  46. command.ExecuteNonQuery();  
相關文章
相關標籤/搜索