1. 程式人生 > 其它 >基於ASP.NET幾十萬資料幾秒鐘就可以匯入到資料庫中

基於ASP.NET幾十萬資料幾秒鐘就可以匯入到資料庫中

        /// <summary>
        /// 一、構建模擬資料存放於DataTable
        /// </summary>
        /// <returns>DataTable</returns>
        public DataTable GetData()
        {
            DataTable dt = new DataTable();
 
            dt.Columns.Add("MemberID", typeof(int));//為新的Datatable新增一個新的列名
            dt.Columns.Add("
Body", typeof(string));//為新的Datatable新增一個新的列名 dt.Columns.Add("IsSecret", typeof(int));//為新的Datatable新增一個新的列名 dt.Columns.Add("AdminReply", typeof(string));//為新的Datatable新增一個新的列名 dt.Columns.Add("AdminReplyTime", typeof(DateTime)); dt.Columns.Add("CreateTime", typeof
(DateTime)); for (int i = 0; i < 100000; i++) //開始迴圈賦值 { DataRow row = dt.NewRow(); //建立一個行 row["MemberID"] = 123; //從總的Datatable中讀取行資料賦值給新的Datatable row["Body"] = "留言了:" + (i + 1).ToString(); row["IsSecret"] = 0
; row["AdminReply"] = "回覆了:" + (i + 1).ToString(); row["AdminReplyTime"] = DateTime.Now; row["CreateTime"] = DateTime.Now.AddMonths(-4); dt.Rows.Add(row);//新增次行 } return dt; } /// <summary> /// 二、例項的資料來源中的列與該例項的目標表中的列之間的對映 /// </summary> /// <returns></returns> public SqlBulkCopyColumnMapping[] GetMapping() { SqlBulkCopyColumnMapping[] mapping = new SqlBulkCopyColumnMapping[6]; mapping[0] = new SqlBulkCopyColumnMapping("MemberID", "MemberID"); mapping[1] = new SqlBulkCopyColumnMapping("Body", "Body"); mapping[2] = new SqlBulkCopyColumnMapping("IsSecret", "IsSecret"); mapping[3] = new SqlBulkCopyColumnMapping("AdminReply", "AdminReply"); mapping[4] = new SqlBulkCopyColumnMapping("AdminReplyTime", "AdminReplyTime"); mapping[5] = new SqlBulkCopyColumnMapping("CreateTime", "CreateTime"); return mapping; } /// <summary> /// DataTable批量新增(有事務) /// </summary> /// <param name="Table">資料來源DataTable</param> /// <param name="DestinationTableName">目標表即需要插入資料的資料表名稱如"Message"</param> public bool MySqlBulkCopy(DataTable Table, string DestinationTableName) { bool Bool = true; using (SqlConnection con = new SqlConnection(DbHelperSQL.connectionString)) { con.Open(); using (SqlTransaction Tran = con.BeginTransaction())//應用事物 { using (SqlBulkCopy Copy = new SqlBulkCopy(con, SqlBulkCopyOptions.KeepIdentity, Tran)) { Copy.DestinationTableName = DestinationTableName;//指定目標表 SqlBulkCopyColumnMapping[] Mapping = GetMapping();//獲取對映關係 if (Mapping != null) { //如果有資料 foreach (SqlBulkCopyColumnMapping Map in Mapping) { Copy.ColumnMappings.Add(Map); } } try { Copy.WriteToServer(Table);//批量新增 Tran.Commit();//提交事務 } catch { Tran.Rollback();//回滾事務 Bool = false; } } } } return Bool; } public ActionResult InsertMoreData() { MySqlBulkCopy(GetData(), "Message"); return RedirectToAction("Index"); }