1. 程式人生 > >簡單三層使用DataTable向資料庫表批量匯入資料---向SqlServer一張表中匯入資料

簡單三層使用DataTable向資料庫表批量匯入資料---向SqlServer一張表中匯入資料

向資料庫的一張表中新增資料,可以採用單個新增,即一條資料、一條資料的新增;也可以採用批量匯入,依次將好些條資料寫入資料庫的一張表中。文字藉助例項《新增系列資訊》講解一種向資料庫批量匯入資料的方法。
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();  
                }  
            }  
        }  
    }