簡單三層使用DataTable向資料庫表批量匯入資料---向SqlServer一張表中匯入資料
阿新 • • 發佈:2019-01-03
向資料庫的一張表中新增資料,可以採用單個新增,即一條資料、一條資料的新增;也可以採用批量匯入,依次將好些條資料寫入資料庫的一張表中。文字藉助例項《新增系列資訊》講解一種向資料庫批量匯入資料的方法。
1.介面設計
觀看一下新增系列資訊部分的介面設計:
本文主要介紹批量匯入系列資訊的實現,單個新增的實現不在此文講解之列!
2.框架結構
此專案的實現,我採用簡單的三層,看一下專案框架
3.批量匯入資料的實現
下面逐層介紹每層實現:
3.1 SqlHelper資料庫助手類中新增向資料庫表匯入資料的方法(SqlHelper.cs)
#region 批量匯入datatable
/// <summary>
/// 批量匯入datatable
/// </summary>
/// <param name="dt">資料表</param>
/// <param name="TabelName">資料表名</param>
/// <param name="dtColum">列集合</param>
public int InsertTable (DataTable dt, string TabelName, DataColumnCollection dtColum)
{
//開啟資料庫
GetConn();
try
{
//宣告SqlBulkCopy ,using釋放非託管資源
using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn))
{
//一次批量的插入的資料量
//sqlBC.BatchSize = 1000;
//超時之前操作完成所允許的秒數,如果超時則事務不會提交 ,資料將回滾,所有已複製的行都會從目標表中移除
//sqlBC.BulkCopyTimeout = 60;
//設定 NotifyAfter 屬性,以便在每插入10000 條資料時,呼叫相應事件。
//sqlBC.NotifyAfter = 10000;
// sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
//設定要批量寫入的表
sqlBC.DestinationTableName = TabelName;
//自定義的datatable和資料庫的欄位進行對應
for (int i = 0; i < dtColum.Count; i++)
{
sqlBC.ColumnMappings.Add(dtColum[i].ColumnName.ToString(), dtColum[i].ColumnName.ToString());
}
//批量寫入
sqlBC.WriteToServer(dt);
}
//匯入成功,返回1
return 1;
}
catch
{
//匯入失敗返回-1
return -1;
}
finally
{
//關閉資料庫
conn.Close();
}
}
#endregion
3.2.DAL層批量匯入資料的程式碼(DaoSeries.cs)
#region 批量匯入系列資訊
/// <summary>
/// 批量匯入系列資訊
/// </summary>
/// <param name="dt">DataTable資料表-dt;</param>
/// <param name="dtColum">DataColumnCollection 列集合-dtColum</param>
/// <returns>整數:大於0代表匯入成功;否則匯入失敗</returns>
public int ImportDatatable(DataTable dt, DataColumnCollection dtColum)
{
//定義一個整型標記變數
int result;
//呼叫sqlHelper的"批量匯入datatable表"的方法
result = sqlheler.InsertTable(dt, "T_SeriesInfo", dtColum);
//返回結果
return result;
}
#endregion
3.3.BLL層批量匯入資料的程式碼(MgrSeriesManager.cs)
#region 批量匯入系列
/// <summary>
/// 批量匯入系列
/// </summary>
/// <param name="dt">資料表</param>
/// <param name="dtColum">資料列集合</param>
/// <returns>整數:大於0代表匯入成功,否則匯入失敗</returns>
public int ImportDatatable(DataTable dt, DataColumnCollection dtColum)
{
DaoSeries series=new DaoSeries();
return series.ImportDatatable(dt, dtColum);
}
#endregion
3.4.介面層構造DataTable資料,向BLL層傳遞(FrmSeriesManager.aspx,FrmSeriesManager.aspx.cs)
這裡構造DataTable資料,我是採用從介面上傳Excel,然後從Excel獲取輸入然後存入DataTable的
3.4.1 從介面傳入Excel,呼叫BLL層Excel轉換成DataTable的方法實現
#region 批量匯入系列
/// <summary>
/// 批量匯入系列
/// </summary>
protected void btnImportSeries_Click(object sender, EventArgs e)
{
//BLL層,新增系列資訊類
MgrSeriesManager series = new MgrSeriesManager();
//BLL層把excel轉化為datatable的方法
MgrCreateExcelData createExcelData = new MgrCreateExcelData();
//獲取上傳檔案地址
string url = fupImprotSeries.PostedFile.FileName.ToString();
if (url == "")
{
//資料來源為空,彈出提示:請選擇Excel檔案!
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('請選擇Excel檔案!');</script>");
return;
}
string urlLocation = url.Substring(url.LastIndexOf("\\") + 1);//獲取檔名
DataTable dt;
//在系統中建資料夾up,並將excel檔案另存
this.fupImprotSeries.SaveAs(Server.MapPath("~\\up") + "\\" + urlLocation);//記錄檔名到伺服器相對應的資料夾中
// Response.Write(urlLocation);
//獲得檔案路徑
string strpath = Server.MapPath("~\\up") + "\\" + urlLocation;
//string strpath = "c:\\abc.xls";
// Response.Write(strpath);
//把excel轉換為datatable
dt = createExcelData.CreateExcelDataSource(strpath);
DataColumnCollection dcc = dt.Columns;
//匯入資料庫
int i = series.ImportDatatable(dt, dcc);
if (i > 0)
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('系列資訊匯入成功!');</script>");
}
else
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('系列資訊匯入失敗!');</script>");
}
}
#endregion
3.4.2 BLL層Excel轉換成DataTable的類(MgrCreateExcelData.cs)
/*************************************************
作者:jql
小組:一中考核系統
說明:把excel轉化為datatable
建立日期:2012年11月25日14:17:06
版本號:v1.0
版權所有:資訊科技提高班
**********************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//引用各名稱空間
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
namespace BLL
{
public class MgrCreateExcelData
{
public MgrCreateExcelData()
{
}
/// <summary>
/// 傳入excel路徑,轉換為datatable
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public DataTable CreateExcelDataSource(string url)
{
DataTable dt = null;
// string connetionStr = "Provider=Microsoft.Ace.OleDb.12.0;" + "Data Source="
// +url + ";" + "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';";
//獲得excel資料
string connetionStr = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + url + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
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();
}
}
}
}