简单三层使用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();  
                }  
            }  
        }  
    }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值