這段時間在解決一個多個表需要同時插入大量數據的問題,于是在網上找了下,查到說用SqlBulkCopy效率很高,實驗后確實很快,10萬條數據只要4秒鐘,用ef要用40秒。但是我的還需兩張表同時插入,且需要用到事務,即有一個失敗,全部Rollback,廢話不多說,直接上代碼吧,下面是用C#語言編寫的。
測試代碼:這是一個簡單的控制臺程序,相信你們都看得懂就不多說了
namespace ConsoleApp12 {class Program{static void Main(string[] args){DataTable dt = new DataTable();dt.Columns.Add("part", typeof(System.String));dt.Columns.Add("name", typeof(System.String));for (int i = 0; i < 20; i++){DataRow dr = dt.NewRow();dr[0] = "餐飲部";dr[1] = "店" + i.ToString();dt.Rows.Add(dr);}DataTable dt2 = new DataTable();dt2.Columns.Add("parts", typeof(System.String));dt2.Columns.Add("names", typeof(System.String));for (int i = 0; i < 20; i++){DataRow dr2 = dt2.NewRow();dr2[0] = "2餐飲部";dr2[1] = "2店" + i.ToString();dt2.Rows.Add(dr2);}string connectionString = "server =.; uid = sa; pwd =123456;database=Test";all.ExecuteSqlTran1(connectionString, "test11", dt, "test12", dt2);}} }
?
數據庫幫助類:主要是這部分,網上是也有寫,但是多數含糊而過,并沒有給出具體代碼,小弟不才,在這里補全了,希望可以幫助到其他的新手。
/// <summary>/// 多個數據庫表同時插入大量數據,并實現數據庫事務。/// </summary>/// <param name="SQLStringList">多條SQL語句</param> public static int ExecuteSqlTran1(string connectionString, string TableName1, DataTable dt1, string TableName2, DataTable dt2){using (SqlConnection conn = new SqlConnection(connectionString)){conn.Open();SqlCommand cmd = new SqlCommand();cmd.Connection = conn;SqlTransaction tx = conn.BeginTransaction();cmd.Transaction = tx;try{int count = 1;using (SqlBulkCopy sqlBC1 = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, tx)){sqlBC1.DestinationTableName = TableName1;//***代表要插入數據的表名foreach (DataColumn dc in dt1.Columns) //傳入上述table {sqlBC1.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);//將table中的列與數據庫表這的列一一對應 }sqlBC1.WriteToServer(dt1);}using (SqlBulkCopy sqlBC2 = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, tx)){sqlBC2.DestinationTableName = TableName2;//***代表要插入數據的表名foreach (DataColumn dc in dt2.Columns) //傳入上述table {sqlBC2.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);//將table中的列與數據庫表這的列一一對應 }sqlBC2.WriteToServer(dt2);}tx.Commit();return count;}catch(Exception ex){var error = ex.ToString();tx.Rollback();return 0;}}}
?
結果在數據庫中已經將dt中內容插入了兩遍,實現了向兩張表同時插入數據,另外,相信大家有耐心看到這的話,3個表同時插入,4個表同時插入也都會了,希望能幫助到大家。
?
小弟不才,有問題請隨時聯系我,一起長進知識。
qq:188261629
?