怎樣把Excel匯入資料庫——整體匯入
上篇部落格中介紹了批量匯入Excel到資料庫,其本質為將Excel轉為DataTable再將DataTable 的資料取出來,一條條的插入到資料庫中。下面我們介紹一種比較優化的方法:將整個DataTable匯入資料庫中。
首先,將Excel中的資料取出,存入DataTable中,程式碼如下:
[csharp] view plaincopy
/// 傳入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
///
批量匯入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將表中的資料匯入,非常方便。當系統需要動態生成表,並且匯入資料時,非批量匯入實現起來就會很困難。簡單來說非批量匯入需要知道表結構並且多次呼叫同一方法;批量匯入表結構需要相同,並且只調用一次方法就可以了。
兩種方法各有利弊,若匯入資料量很小並且不必每個欄位都匯入的話,非批量匯入可以勝任;若匯入的資料量很大,不清楚表結構,只要匯入所有資料即可的話,批量匯入就很有優勢。具體情況具體分析選擇合適的方法。