《项目经验》--简单三层使用DataTable向数据库表批量导入数据---向SqlServer一张表中导入数据

2023-05-16

    向数据库的一张表中添加数据,可以采用单个添加,即一条数据、一条数据的添加;也可以采用批量导入,依次将好些条数据写入数据库的一张表中。文本借助实例《添加系列信息》讲解一种向数据库批量导入数据的方法。


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多张张表中导入数据》!


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《项目经验》--简单三层使用DataTable向数据库表批量导入数据---向SqlServer一张表中导入数据 的相关文章

  • jetson xavier nx 上 bash: nvcc: command not found

    jetson Xavier nx上已经默认安装好了cuda cuda 10 2和cudnn等 出现这个问题是因为 我们需要把cuda目录下的bin文件添加到环境变量中 解决方案 vim bashrc 按 i 进入输入模式 xff0c 在最后
  • ROS下使用intel Realsense摄像头进行人脸检测

    使用准备条件 xff1a ROS indigo intel Realsense摄像头 xff08 我使用的依旧是R200 xff09 确保已经正常安装驱动 xff0c 安装方法见博文 http blog csdn net may0324 a
  • 【VINS-MONO】RealsenseD435i运行VINS-Mono

    1 查看需要的 camera imu的topic内容格式 xff1a roscore rosbag play lt bag gt rostopic list rostopic echo lt topic gt 2 对齐XJ2 bag中的IM
  • vsCode如何自动保存代码

    文件 勾选自动保存 xff0c 即可
  • 智能设备WIFI配网方式汇总

    当前很多物联网设备大都无没有人机交互界面 xff0c 也就没有像手机或者PC那样有wifi的配置界面 xff0c 汇总了一下设备入网的方式大概有如下几种 xff1a 1 xff1a AP 模式流程如下 1 将Dev手动设置为AP模式 xff
  • 平凡的人生or开挂的人生——对知乎相关问题的回答

    知乎原题 xff1a 为什么有些人的人生和开了挂一样 xff1f https www zhihu com question 37106162 楼上说的都特别好 xff0c 我很想补充一点 我先抛出一个背景概念 我认为开挂人生 xff0c 本
  • Linux内核机制总结中断异常和系统调用之系统调用(三十三)

    文章目录 1 系统调用1 1 定义系统调用1 2 执行系统调用 重要 xff1a 本系列文章内容摘自 lt Linux内核深度解析 gt 基于ARM64架构的Linux4 x内核一书 xff0c 作者余华兵 系列文章主要用于记录Linux内
  • Web前端工程化之VSCode+Git 解决冲突和error

    多人协作开发使用版本控制难免会有冲突 xff0c 在前端使用VSCode和Git过程中 xff0c 就会遇到大大小小的冲突 xff0c 有的merge一下 xff0c 然后提交推送就可解决 xff0c 有的是因为HEAD指针混乱造成 xff
  • 平时积累(四)

    1 重启Android运行环境 xff1a xff08 1 xff09 sudo adb shell stop xff08 2 xff09 sudo adb shell start 2 设置Android系统属性 xff1a xff08 1
  • 速度环+直立环+转向环

    文章目录 直立环直立环调节速度环速度环调节转向环 直立环 车模平衡控制也是通过负反馈来实现的 xff0c 与上面保持木棒直立比较则相对简单 因为车模有两个轮子着地 xff0c 车体只会在轮子滚动的方向上发生倾斜 控制轮子转动 xff0c 抵
  • 六轴传感器+卡尔曼滤波+一阶低通滤波

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 角度与角速度测量1 角度与角速度获取2 互补滤波3卡尔曼滤波4 实现卡尔一阶低通滤波5 实现卡尔曼滤波算法 角度与角速度测量 1
  • Android 自定义注解之运行时注解(RetentionPolicy.RUNTIME)

    RetentionPolicy RUNTIME xff1a 注解不仅被保存到class文件中 xff0c jvm加载class文件之后 xff0c 仍然存在 获取注解的常用方法 xff1a 获取指定类型的注解 public lt A ext
  • H5C3__元素垂直居中的方法

    在 CSS 中对元素进行水平居中是非常简单的 xff1a 如果它是一个行内元素 xff0c 就对它的父元素应用 text align center 如果它是一个块级元素 xff0c 就对它自身应用 margin auto 还有没有其他的方法
  • 2013年期中总结 2013年9月10日20:17:49

    题目中的时间 xff0c 我改了几次 xff0c 一直在想这半年来的经历 xff0c 我想我是成长着的吧 xff01 继上次总结 2012年年度总结 2013年2月25日21 49 44 xff0c 眨眼过去了半年 xff0c 细细想来这半
  • 关于行业代码对应表的数据库设计及导入(4位行业代码)

    最近使用asp net 43 sqlserver 43 layui前端框架完成了一个小页面 xff0c 其中有一个功能是需要将行业代码表导入倒数据库 看到这个行业代码表 xff0c 刚开始还真是无从下手 xff0c 经过查询找到一个页面是关
  • Gitblit服务器邮件配置

    关于Gitblit在windows下邮箱配置 xff0c 网上资料比较少 xff0c 自己摸索步骤如下 xff0c 实测有效 xff0c 另外 xff0c 如果不了解SMTP协议 xff0c 建议配置之前先去大概了解下 xff0c 当然没有
  • 当你不想学习的时候,来看看大脑是怎么想的《摘抄与所想》

    尽管科学家一个接一个的科研成果让我们对记忆有了越来越多的了解 xff0c 但直到今天 xff0c 科学家所发现的所谓大脑的秘密也只是冰山一角 xff0c 在很大程度上 xff0c 大脑和记忆仍是神秘的 研究人员认为 xff0c 记忆是一个过
  • English learning method ---学英语重中之重打通“任督二脉”

    漫漫十年艰辛路 xff0c 英语学习之旅 曾经秉承 路漫漫其修远兮 xff0c 吾将上下而求索 的信念 xff0c 初一那年了解到原来 xff08 a b c d e f g xff09 不仅仅读作 xff08 啊 xff0c 波 xff0
  • DRP过后,感受知识间的通性

    DRP视频看了不短的时间 xff0c 真正开始DRP的时间是7月17号 xff0c 至今两个月了 由于暑假期间英语的学习占得时间比较多 xff0c 所以DRP视频进行的很慢 9月11号看完了DRP所有的视频 xff0c 这个项目完成后最大的
  • English learning method ---我谈音标学习

    最近在想这样一个问题 xff1a 每个地方都有自己的方言 xff0c 有些方言我们完全听不懂 xff0c 但是他们当地人却可以交流的很好 xff1b 而非本地人说方言 xff0c 就要模仿他们的腔调 xff0c 模仿的多了说出来的味也就像了

随机推荐