1. 程式人生 > >怎樣把Excel匯入資料庫——整體匯入

怎樣把Excel匯入資料庫——整體匯入

  上篇部落格中介紹了批量匯入Excel到資料庫,其本質為將Excel轉為DataTable再將DataTable 的資料取出來,一條條的插入到資料庫中。下面我們介紹一種比較優化的方法:將整個DataTable匯入資料庫中。

  首先,將Excel中的資料取出,存入DataTable中,程式碼如下:

  [csharp] view plaincopy

在CODE上檢視程式碼片
派生到我的程式碼片
///

  /// 傳入excel路徑,轉換為datatable

  ///

  ///

  ///

  public DataTable CreateExcelDataSource(string url)

  {

  //定義一個DataTable資料表

  DataTable dt = null;

  //獲得excel資料

  string connetionStr = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + url + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";

  //從Excel表的Sheet1單元格獲取資料

  string strSql = "select * from [Sheet1$]";

  OleDbConnection oleConn = new OleDbConnection(connetionStr);

  OleDbDataAdapter oleAdapter = new OleDbDataAdapter(strSql, connetionStr);

  try

  {

  //把Excel資料填充給DataTable

  dt = new DataTable();

  oleAdapter.Fill(dt);

  //返回資料表

  return dt;

  }

  catch (Exception ex)

  {

  throw ex;

  }

  finally

  {

  oleAdapter.Dispose();

  oleConn.Close();

  oleConn.Dispose();

  //刪除上傳的Excel檔案(因為該檔案的存在會佔用多餘的網站空間)

  if (File.Exists(url))

  {

  File.Delete(url);

  }

  }

  }

  我們獲得了可以存入SQLServer資料庫中的DataTable了,按照之前的想法,是用迴圈將DataTable中的資料取出來,一條條的插入資料庫;對於資料量小的資料來源來說,這種做法還可以接受,但是當匯入的資料相當多是,這種做法的效能是可想而知的。那麼我們來看一下,如何用更優的方法解決這個問題。

  批量匯入程式碼如下:

  [csharp] view plaincopy

在CODE上檢視程式碼片
派生到我的程式碼片
#region 批量匯入DataTable

  ///

批量匯入DataTable

  /// 批量匯入DataTable

  ///

  /// DataTable資料表

  /// 表名

  /// 資料列集合

  /// Boolean值:true成功,false失敗

  public Boolean InsertTable(DataTable dt, string tableName, DataColumnCollection dtColum)

  {

  //開啟資料庫

  GetConn();

  try

  {

  //宣告SqlBulkCopy ,using釋放非託管資源

  using (SqlBulkCopy sqlBC = new SqlBulkCopy(sqlConn))

  {

  //一次批量的插入的資料量

  sqlBC.BatchSize = 1000;

  //超時之前操作完成所允許的秒數,如果超時則事務不會提交 ,資料將回滾,所有已複製的行都會從目標表中移除

  sqlBC.BulkCopyTimeout = 60;

  //設定要批量寫入的表

  sqlBC.DestinationTableName = tableName;

  for (int i = 0; i < dtColum.Count; i++)

  {

  sqlBC.ColumnMappings.Add(dtColum[i].ColumnName.ToString(), dtColum[i].ColumnName.ToString());

  }

  //批量寫入

  sqlBC.WriteToServer(dt);

  }

  return true;

  }

  catch

  {

  return false;

  }

  finally

  {

  //關閉資料庫

  sqlConn.Close();

  }

  }

  #endregion

  下面我們來比較一下兩種匯入方式的特點。

  非批量匯入的特點,非批量匯入表結構不必相同,只需要把每一條資料提取出來,迴圈執行寫入方法,寫入資料庫中;而批量匯入呢?則需要表結構相同,表結構相同則可以只調用一次系統封裝好的方法ColumnMappings將表中的資料匯入,非常方便。當系統需要動態生成表,並且匯入資料時,非批量匯入實現起來就會很困難。簡單來說非批量匯入需要知道表結構並且多次呼叫同一方法;批量匯入表結構需要相同,並且只調用一次方法就可以了。

  兩種方法各有利弊,若匯入資料量很小並且不必每個欄位都匯入的話,非批量匯入可以勝任;若匯入的資料量很大,不清楚表結構,只要匯入所有資料即可的話,批量匯入就很有優勢。具體情況具體分析選擇合適的方法。