OracleBulkCopy 批量插入oracle資料庫的方法
阿新 • • 發佈:2019-02-01
只有安裝了客戶端的機器上才可以用,要用到ODP.NET元件中的oracleDataAccess.DLL,名稱空間引用為Oracle.DataAccess.Client;
#region 批量插入資料 /// <summary> /// 批量插入資料 /// </summary> /// <param name="dt">要插入的資料</param> /// <param name="targetTable">資料庫中的表</param> public static void BulkToDB(DataTable dt, string targetTable) { OracleConnection conn = new OracleConnection(connOrcleString); OracleBulkCopy bulkCopy = new OracleBulkCopy(connOrcleString, OracleBulkCopyOptions.UseInternalTransaction); //用其它源的資料有效批量載入Oracle表中 //conn.BeginTransaction(); //OracleBulkCopy bulkCopy = new OracleBulkCopy(connOrcleString, OracleBulkCopyOptions.Default); bulkCopy.BatchSize = 100000; bulkCopy.BulkCopyTimeout = 260; bulkCopy.DestinationTableName = targetTable; //伺服器上目標表的名稱 bulkCopy.BatchSize = dt.Rows.Count; //每一批次中的行數 try { conn.Open(); if (dt != null && dt.Rows.Count != 0) bulkCopy.WriteToServer(dt); //將提供的資料來源中的所有行復制到目標表中 } catch (Exception ex) { throw ex; } finally { conn.Close(); if (bulkCopy != null) bulkCopy.Close(); } } #endregion -------------------------------------------------------------------------------------------------- 第二種方法: public static void AddDBSqlBulkCopy() { DataTable dt = new DataTable(); DataColumn dcname = new DataColumn("Name",typeof(System.String)); dt.Columns.Add(dcname); for (int i = 0; i < 10; i++) { DataRow row = dt.NewRow(); row["Name"] ="Name_" + i.ToString(); dt.Rows.Add(row); } DataSet ds = new DataSet(); ds.Tables.Add(dt); SqlConnection conn = new SqlConnection(connectionString); conn.Open(); //宣告SqlBulkCopy ,using釋放非託管資源 using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn)) { //一次批量的插入的資料量 sqlBC.BatchSize = 1000; //超時之前操作完成所允許的秒數,如果超時則事務不會提交 ,資料將回滾,所有已複製的行都會從目標表中移除 sqlBC.BulkCopyTimeout = 60; //設定NotifyAfter 屬性,以便在每插入10000 條資料時,呼叫相應事件。 sqlBC.NotifyAfter = 10000; sqlBC.SqlRowsCopied += newSqlRowsCopiedEventHandler(sqlBC_SqlRowsCopied); //設定要批量寫入的表 sqlBC.DestinationTableName ="dbo.Name"; //自定義的datatable和資料庫的欄位進行對應 sqlBC.ColumnMappings.Add("Name", "userName"); // sqlBC.ColumnMappings.Add("Name",1); //批量寫入 sqlBC.WriteToServer(dt); } conn.Dispose(); } static void sqlBC_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e) { }