《项目经验》--简单三层使用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();
            }
        }
    }
}


   至此向数据库批量导入数据就实现了,如果你想对要导入数据库的数据做合法性判断,执行Excel转换成Datatable时,自己加些判断处理就行了!

   下面这篇文章介绍了向数据库多张表批量导入数据的实现:《项目经验---简单三层使用DataTable向数据库表批量导入数据---向SqlServer多张张表中导入数据》!


评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值