標籤:
能承受上萬資料量,速度快,並且使用了事務,不會出現某條資料錯誤而導致部分資料插入(要是全部成功要是一條都不成功,測試過程中沒出現失敗),需要的朋友可以參考下
1.NPOI
2.MySql.Data
這裡做個記錄,待日後使用
連接字串 app.config:
<connectionStrings> <add name="DBConnectString" connectionString="Server=ip;Database=testjh;Uid=user;Pwd=123456;charset=utf8" providerName="MySql.Data.MySqlClient"/> </connectionStrings>
執行多條sql語句:
/// <summary> /// 執行多條SQL語句,實現資料庫事務。 /// </summary>mysql資料庫 /// <param name="SQLStringList">多條SQL語句</param> public static void ExecuteSqlTran(List<string> SQLStringList) { using (MySqlConnection conn = new MySqlConnection(MySqlHelper.connectionString)) { conn.Open(); MySqlCommand cmd = new MySqlCommand(); cmd.Connection = conn; MySqlTransaction tx = conn.BeginTransaction(); cmd.Transaction = tx; try { for (int n = 0; n < SQLStringList.Count; n++) { string strsql = SQLStringList[n].ToString(); if (strsql.Trim().Length > 1) { cmd.CommandText = strsql; cmd.ExecuteNonQuery(); } //後來加上的 if (n > 0 && (n % 500 == 0 || n == SQLStringList.Count - 1)) { tx.Commit(); tx = conn.BeginTransaction(); } } //tx.Commit();//原來一次性提交 } catch (System.Data.SqlClient.SqlException E) { tx.Rollback(); throw new Exception(E.Message); } } }
單擊按鈕:
/// <summary> /// 單擊按鈕 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { button1.Text = "正在插入中..."; OpenFileDialog file1 = new OpenFileDialog(); file1.Filter = "Excel檔案|*.xlsx"; if (file1.ShowDialog() == DialogResult.OK) { //開始讀excel Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); ; Microsoft.Office.Interop.Excel.Workbook workbook = xlApp.Workbooks.Open(file1.FileName, 0, false, 5, "", "",false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, 1, 0); int n = workbook.Worksheets.Count; string[] sheetSet = new string[n]; ArrayList al = new ArrayList(); for (int i = 0; i < n; i++) { sheetSet[i] = ((Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[i + 1]).Name; } xlApp.Workbooks.Close(); ExcelHelper ex = new ExcelHelper(file1.FileName); if (sheetSet.Length > 0)//判斷存在 一個 Sheet1 { int countLength = sheetSet.Length;//表示 Sheet的個數 dt1 = ex.ExcelToDataTable(sheetSet[0], true);//"Sheet1" ,先假如只有一個Sheet1 insertMySql(); } } }
寫入資料:
public void insertMySql() { try { int ColumnsCount = dt1.Columns.Count;//得到讀出表中 列的數量 string str = string.Empty; string[] strArr = new string[ColumnsCount]; string valuesStr = string.Empty; List<string> listStr=new List<string>(); for (int i = 0; i < dt1.Rows.Count; i++) { DataRow dr = dt1.Rows[i]; for (int j = 0; j < ColumnsCount; j++) { strArr[j] = dr.ItemArray[j].ToString(); } string sqlInsert =string.Format("insert into t_test(torder,tname,stu_num,tage) values(‘{0}‘,‘{1}‘,‘{2}‘,‘{3}‘)",strArr[0],strArr[1],strArr[2],strArr[3]); listStr.Add(sqlInsert); #region 沒使用事務 //string sql = "insert into t_test(torder,tname,stu_num,tage) values(@torder,@tname,@stu_num,@tage)"; //MySqlParameter[] parms = { // new MySqlParameter("@torder",strArr[0]), // new MySqlParameter("@tname",strArr[1]), // new MySqlParameter("@stu_num",strArr[2]), // new MySqlParameter("@tage",strArr[3]) // }; // 在這裡可以直接調用 ExecuteNonQuery 向資料庫插資料 // MySqlHelper.ExecuteNonQuery(MySqlHelper.connectionString, CommandType.Text, sql, parms); #endregion } ExecuteSqlTran(listStr);//使用事務插入 // button1.Text = "插入成功!"; Thread.Sleep(10000); button1.Text = "插入成功,請選擇Excel檔案!"; } catch (Exception ex) { throw ex; } }
MySqlHelper: 應該把 ExecuteSqlTran 這個類方法放入該類,這裡我沒有這麼做,項目小(零時需求)就沒這麼做了!
public static string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["DBConnectString"].ToString();
將 Excel 資料匯入 MySql